Categories: Docker

Docker 安装与配置

Docker入门与实践

安装并启动docker

直接通过脚本来安装

# wget -qO- https://get.docker.com/ | sh

安装完成后启动Docker

# systemctl start docker

# systemctl status docker

配置Docker服务

为了避免每次使用Docker命令都需要切换到特权账户,将当前用户加入安装中自动创建的docker用户组:

# sudo usermod -aG docker root

我们可以使用docker info命令来查看Docker的信息。

使用docker镜像

获取镜像

我们首先获取下镜像,这个是基础,获取镜像的时候要tag标签打全,否则会下载latest镜像,可能是不稳定版本。

# docker pull ubuntu:18.04

查看镜像信息

使用images命令列出镜像

# docker images

其中的image id,如果2个镜像的id相同说明指向了同一个镜像,只是tag标签不同而已。

使用tag命令来添加镜像标签

为了方便后续工作中使用镜像,我们可以为本地镜像添加任意标签

# docker tag ubuntu:18.04 myubuntu:18.04

可以看到ID都是相同的,实际是同一个镜像,只是别名不同而已。相当于做了个链接。

使用inspect命令查看详细信息

这个命令可以查看镜像的详细信息,包括作者,适应架构等

# docker inspect ubuntu:18.04

上面返回了一个JSON格式的消息,如果只要其中的一段,可以-f参数来指定

# docker inspect -f {{".Architecture"}} ubuntu:18.04

使用history命令来查看镜像历史

镜像文件是由多个层组成的,我们可以使用history命令查看各层的创建信息。

# docker history ubuntu:18.04

搜寻镜像

docker的命令search可以搜索官方库里的镜像

搜索官方的nginx镜像

# docker search --filter=is-official=true nginx

搜索收藏数量超过4的tensorflow镜像

# docker search --filter=stars=4 tensorflow

删除和清理镜像

rm和prune命令

使用标签删除镜像

rmi或image rm命令删除镜像

-f强制删除镜像,即使有容器依赖

-no-prune 不清理未带标签的父镜像

删除ubuntu 18.04镜像

# docker rmi myubuntu:18.04

当同一个镜像有多个标签时,只删除了这个镜像标签的指定标签而已,不影响原来的镜像文件。

我们这里还能看到原来的镜像

如果镜像只有一个标签就要小心了,会彻底删除镜像。

下面就是删除只有一个标签的镜像,彻底删除这个镜像的所有层了

使用镜像ID来删除镜像

使用rmi删除镜像id(也可以是能区分的部分id串前缀),会先尝试删除所有指向该镜像的标签,然后删除镜像文件本身。

当用这个镜像创建了容器时,这个镜像时无法删除的。

可以用docker ps -a 查看本机存在的所有容器。

如果要强行删除镜像使用-f参数

docker rmi -f ubuntu:18.04

然后使用ID来删除镜像

# docker rmi 93fd78260bd1

清理镜像

使用docker一段时间后,系统中会有一些临时的镜像文件,以及一些没用被使用的镜像,可以通过docker image prune命令来清理。

下面的命令演示自动清理临时的遗留镜像文件层,最后会提示释放的存储空间

# docker image prune -f

创建镜像

创建镜像的方法主要有三种,基于已有的镜像的容器来创建,基于本地模板导入,基于dockerfile创建。

基于已有容器创建

首先,启动一个镜像,并在其中进行修改操作,例如创建一个test文件,之后退出

# docker run -it ubuntu:18.04 /bin/bash

root@486c30677dc2:/# touch test

root@486c30677dc2:/# exit

记住容器id为486c30677dc2

这时镜像和原来的相比以机发生了改变,可以用命令来提交作为一个新的镜像。提交时可以使用ID或名称来指定容器

docker commit -m "Added a new file" -a "Docker New" 486c30677dc2 test:0.1

此时查看本地镜像列表,会发现新的镜像已经存在了

基于本地模板导入

可以直接从一个操作系统模板文件导入一个镜像,主要使用docker import命令。

我们从openvz提供的模板来创建,https://download.openvz.org/template/precreated/下载地址

我们随便下一个

# wget https://download.openvz.org/template/precreated/ubuntu-16.04-x86_64.tar.gz

然后导入

# cat ubuntu-16.04-x86_64.tar.gz | docker import - ubuntu:16.04

基于Dockerfile创建

这是最常见的方式,Dockerfile是一个文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。以后会做这个实验

存出和载入镜像

save和load命令

存出镜像

可以加-o参数,导出镜像到指定的文件中

导出本地ubuntu:18.04镜像为文件ubuntu_18.04.tar

# docker save -o ubuntu-18.04.tar ubuntu:18.04

然后就可以把这个文件分享给别人

载入镜像

可以将导出的tar文件在导入到本地的镜像库,可以用-i参数,从指定文件中读入镜像内容。

# docker load -i ubuntu-18.04.tar

或者# docker load < ubuntu-18.04.tar

这将导入镜像及相关的元数据信息包括标签,导入成功后可以用docker images命令查看,与原镜像一致。

上传镜像

push命令,默认上传到Docker Hub官方仓库,需要登陆。要去官方注册下。

用户user上传本地的test:lastest镜像,可以先添加新的标签user/test:lastest,然后docker push命令上传

docker tag test:latest user/test:lastest

docker push user/test:lastest

第一次上传会提示输入用户名密码,以后就会记录到~/.docker目录下。

操作Docker容器

镜像介绍完了,下面开始容器了。作为一名VMware的虚拟化工程师我是这么理解镜像,容器,仓库概念的。容器就相当于我们的桌面虚拟化。仓库是存着你的桌面系统镜像,win7.win8,win10,容器就是Thinapp,像office,winrar,这些软件。镜像就是win7这些操作系统,我们提供用户桌面虚拟机的话,先提供一个操作系统,然后上面加上软件,提供给用户,容器我个人认为也是这样的概念。当然docker上的操作系统非常的小,比虚拟机小多了。

创建容器

新建容器

使用docker create命令新建一个容器。

# docker create -it ubuntu:18.04

# docker ps -a

新建容器之后,容器处于停止状态,使用docker start命令来启动

启动容器

下面我们来启动容器,下面的命令后面f7就是前面容器的id,然后用docker ps命令查看运行中的容器

# docker start f7

新建并启动容器

我们也可以新建并直接启动一个容器,docker run命令

下面输出一个Hello world之后容器自动停止

# docker run ubuntu:18.04 /bin/echo 'hello world'

利用docker run来创建并启动容器时,后台会有下面的几个标准操作

  • 检查本地是否存在指定的镜像,不存在就从公有云仓库下载
  • 利用镜像创建一个容器,并启动容器
  • 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层
  • 从宿主机配置的网桥中桥接一个虚拟接口到容器中
  • 从网桥地址池分配一个ip给容器
  • 执行用户指定的应用程序
  • 执行完毕容器自动停止

下面启动一个bash终端,可以让用户交互

# docker run -it ubuntu:18.04 /bin/bash

-it命令就是让用户来交互的,更多命令选项man docker-run查看。

交互模式下,用户可以自己输入命令

ps可以看到指运行了一个bash

可以输入exit来退出容器,退出容器后,容器就关闭了。

守护态运行

很多时候比如我们用nginx的容器,我们要他始终运行,就要用守护态形式,使用-d参数

# docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

然后用docker ps查看id

查看容器输出

docker logs命令查看容器输出的信息

-details 打印详细的信息,很多命令不写了

# docker logs 8e6a

停止容器

暂停容器

Docker pause命令

我们先启动一个容器,然后在暂停

# docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

# docker pause 7d1bb

终止容器

Docker stop命令

该命令会先向容器发送sigterm信号,等待一段时间后(默认10秒),在发送sigkill信号来终止容器。

# docker stop 7d1bb

此时在执行下docker container prune命令,会自动清除掉处于停滞状态的容器。

此外,还可以输入docker kill命令强制关闭容器。

可以用下面的命令来查看所有容器ID

# docker ps -qa

终止状态的容器可以通过docker start命令来重新启动

Docker restart 重启容器

进入容器

使用-d参数。容器会在后台运行,我们无法看到容器中的信息,需要进入容器操作,可以用attach或者exec命令。

Attach命令

这个是官方自带的命令

# docker run -itd ubuntu

80376feff7971c125cb0589a4ad585f4e2b9f1ef95c70d2ff71dce565d445ea0

# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

80376feff797 ubuntu "/bin/bash" 9 seconds ago Up 8 seconds dazzling_spence

# docker attach dazzling_spence

root@80376feff797:/#

这个命令不太方便推荐下面的命令。

Exec命令

我们直接进入一个容器,并启动一个bash

# docker exec -it 31c4 /bin/bash

删除容器

Docker rm命令,默认只能删除已经终止或退出状态的容器,如果在运行的容器不能删除,可以加-f参数,强制关闭容器,然后删除。

# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

31c4c1c26621 ubuntu "/bin/bash" 4 minutes ago Up 4 minutes hardcore_davinci

80376feff797 ubuntu "/bin/bash" 7 minutes ago Exited (0) 4 minutes ago dazzling_spence

# docker rm 31c4

Error response from daemon: You cannot remove a running container 31c4c1c26621732ef83348049ccdd5547742937a92bef7df148025d53cf3420a. Stop the container before attempting removal or force remove

# docker rm -f 31c4

31c4

# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

80376feff797 ubuntu "/bin/bash" 10 minutes ago Exited (0) 7 minutes ago dazzling_spence

查看容器

查看容器详情

Docker container inspect命令

# docker container inspect 8037

查看容器内进程

Docker top命令

查看统计信息

Docker stats 显示docker使用的cpu 内存等信息

王哥哥

Share
Published by
王哥哥

Recent Posts

ESXi精简置备盘空间回收

   家里的nuc上lab环境…

18 小时 ago

Dell MD系列存储重置管理密码

正好手里有几台Dell MD3…

20 小时 ago

Dell ME4存储管理口无法登录修复

这次碰到一台DELL ME40…

2 天 ago

分享个便宜速度快的云主机

野草云 https://my.…

1 月 ago

众筹微软大佬徐庭老师M365课程

 联系邮箱:gyd1#vip.…

2 月 ago

求职

 邮箱:gyd1#vip.qq…

2 月 ago