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 内存等信息