- Docker容器管理
- Docker容器镜像制作
1.Docker容器管理
1.1 创建新容器但不启动
# docker create -it daocloud.io/library/centos:5 /bin/bash
1.2 创建并运行一个新Docker 容器
同一个镜像可以启动多个容器,每次执行run子命令都会运行一个全新的容器
# docker run -it --restart=always centos /bin/bash
如果执行成功,说明CentOS 容器已经被启动,并且应该已经得到了 bash 提示符。
-i 捕获标准输入输出 -t 分配一个终端或控制台
--restart=always
容器随docker engine自启动,因为在重启docker的时候默认容器都会被关闭
也适用于create选项--rm
默认情况下,每个容器在退出时,它的文件系统也会保存下来,这样一方面调试会方便些,因为你可以通过查看日志等方式来确定最终状态。另一方面,也可以保存容器所产生的数据。
但是当你仅仅需要短暂的运行一个容器,并且这些数据不需要保存,你可能就希望Docker能在容器结束时自动清理其所产生的数据。这个时候就需要--rm参数了。注意:--rm 和 -d不能共用容器名称:
--name= Assign a name to the container
--为容器分配一个名字,如果没有指定,docker会自动分配一个随机名称
是docker run子命令的参数可以通过三种方式调用容器命名:
1)使用UUID长命名("f78375b1c487e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778")
2)使用UUID短Id("f78375b1c487")
3)使用Name("evil_ptolemy")这个UUID标识是由Docker deamon生成的。
如果你在执行docker run时没有指定--name,那么deamon会自动生成一个随机字符串UUID。
但是对于一个容器来说有个name会非常方便,当你需要连接其它容器时或者类似需要区分其它容器时,使用容
器名称可以简化操作。无论容器运行在前台或者后台,这个名字都是有效的。保存容器PID equivalent:
如果在使用Docker时有自动化的需求,你可以将containerID输出到指定的文件中(PIDfile),类似于某些应用程序将自身ID输出到文件中,方便后续脚本操作。
--cidfile="": Write the container ID to the file断开与容器的连接,并且关闭容器:
当使用/bin/bash 或者/bin/sh 参数时退出时与容器断开,并关闭容器
root@d33c4e8c51f8 /#exit
如果只想断开和容器的连接而不关闭容器:
快捷键:ctrl+p+q
查看容器:
只查看运行状态的容器:
#docker ps
#docker ps -a -a 查看所有容器
只查看所有容器id:
# docker ps -a -q
列出最近一次启动的容器:
# docker ps -l
1.3 容器详细信息
inspect Return low-level information on a container or image
用于查看容器的配置信息,包含容器名、环境变量、运行命令、主机配置、网络配置和数据卷配置等。
查找某一个运行中容器的id,然后使用docker inspect命令查看容器的信息:
可以使用镜像id的前面部分,不需要完整的id。
# docker inspect d95 //d95是我机器上运行的一个容器ID的前3个字符
容器里在安装ip或ifconfig命令之前,查看网卡IP显示容器IP地址和端口号,如果输出是空的说明没有配置IP地址(不同的Docker容器可以通过此IP地址互相访问)
# docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器id
列出所有绑定的端口:
# docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} {{(index $conf 0).HostPort}} {{end}}' $INSTANCE_ID
# docker inspect --format='{{range $p,
$conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}'
b220fabf815a找出特殊的端口映射:比如找出容器里22端口所映射的docker本机的端口
# docker inspect --format='{{(index (index .NetworkSettings.Ports "22/tcp") 0).HostPort}}' $INSTANCE_ID
启动容器:
# docker start name
关闭容器:
# docker stop name
# docker kill name --强制终止容器
杀死所有running状态的容器
# docker kill $(docker ps -q)
删除容器:
# docker rm 容器id或名称
要删除一个运行中的容器,添加 -f 参数
根据格式删除所有容器:
# docker rm $(docker ps -qf status=exited)
重启容器:
#docker restart name
暂停容器:
pause --暂停容器内的所有进程,
通过docker stats可以观察到此时的资源使用情况是固定不变的,通过docker logs -f也观察不到日志的进一步输出。恢复容器:
unpause --恢复容器内暂停的进程,与pause参数相对应
# docker start infallible_ramanujan
这里的名字是状态里面NAMES列列出的名字,这种方式同样会让容器运行在后台
让容器运行在后台:
果在docker run后面追加-d=true或者-d,那么容器将会运行在后台模式。此时所有I/O数据只能通过网络资源或者共享卷组来进行交互。因为容器不再监听你执行docker run的这个终端命令行窗口。但你可以通过执行docker attach来重新附着到该容器的回话中
容器运行在后台模式下,是不能使用--rm选项的(老版本是这样,新版本已经可以同时生效)
#docker run -d IMAGE[:TAG] 命令
容器日志:
#docker logs container_id [root@qfedu.com ~]#打印该容器的输出
# docker run -it -d --name mytest docker.io/centos /bin/sh -c "while true; do echo hello world; sleep 2; done"
# docker run -it -d --name mytest docker.io/centos /bin/sh -c "while true; do echo hello world; sleep 2; done"
docker attach container_id #附加该容器的标准输出到当前命令行
此时,ctrl+d等同于exit命令,按ctrl+p+q可以退出到宿主机,而保持container仍然在运行
rename
Rename a containerstats
Display a live stream of container(s) resource usage statistics
--动态显示容器的资源消耗情况,包括:CPU、内存、网络I/Oport
List port mappings or a specific mapping for the CONTAINER
--输出容器端口与宿主机端口的映射情况# docker port blog
容器blog的内部端口80映射到宿主机的80端口,这样可通过宿主机的80端口查看容器blog提供的服务
1.3 连接容器
方法1.attach
# docker attach 容器id //前提是容器创建时必须指定了交互shell
方法2.exec
通过exec命令可以创建两种任务:后台型任务和交互型任务
交互型任务:
# docker exec -it 容器id /bin/bash
后台型任务:
# docker exec 容器id touch /testfile
监控容器的运行:
可以使用logs、top、events、wait这些子命令
logs:
使用logs命令查看守护式容器;可以通过使用docker logs命令来查看容器的运行日志,其中--tail选项可以指定查看最后几条日志,而-t选项则可以对日志条目附加时间戳。使用-f选项可以跟踪日志的输出,直到手动停止。
# docker logs App_Container //不同终端操作
# docker logs -f App_Container
top:
显示一个运行的容器里面的进程信息
# docker top birdben/ubuntu:v1
events :
Get real time events from the server
实时输出Docker服务器端的事件,包括容器的创建,启动,关闭等。
# docker start loving_meninsky
# docker events //不同终端操作
wait(X):
Block until a container stops, then print its exit code
--捕捉容器停止时的退出码
执行此命令后,该命令会"hang"在当前终端,直到容器停止,此时,会打印出容器的退出码
# docker wait 01d8aa //不同终端操作
diff:
查看容器内发生改变的文件;用diff查看:
包括文件的创建、删除和文件内容的改变都能看到# docker diff 容器名称
C对应的文件内容的改变,A对应的均是文件或者目录的创建删除
宿主机和容器之间相互Copy文件
cp的用法如下:
docker cp [OPTIONS] CONTAINER:PATH LOCALPATH
docker cp [OPTIONS] LOCALPATH CONTAINER:PATH如:容器mysql中/usr/local/bin/存在docker-entrypoint.sh文件,可如下方式copy到宿主机
# docker cp mysql:/usr/local/bin/docker-entrypoint.sh /root
修改完毕后,将该文件重新copy回容器
# docker cp /root/docker-entrypoint.sh mysql:/usr/local/bin/
1.4 stop和kill的区别
docker stop命令给容器中的进程发送SIGTERM信号,默认行为是会导致容器退出,当然,容器内程序可以捕获该信号并自行处理,例如可以选择忽略。而docker kill则是给容器的进程发送SIGKILL信号,该信号将会使容器必然退出。
2.Docker容器镜像制作
2.1 容器文件系统打包
将容器的文件系统打包成tar文件,也就是把正在运行的容器直接导出为tar包的镜像文件
export Export a container's filesystem as a tar archive
有两种方式(elated_lovelace为容器名)
第一种:
# docker export -o elated_lovelace.tar elated_lovelace
第二种:
# docker export 容器名称 > 镜像.tar
导入镜像归档文件到其他宿主机:
import Import the contents from a tarball to create a filesystem image
# docker import elated_lovelace.tar elated_lovelace:v1
注意: 如果导入镜像时没有起名字,随后可以单独起名字(没有名字和tag),可以手动加tag
docker tag 镜像ID mycentos:7
2.2 通过容器创建本地镜像
容器运行起来后,又在里面做了一些操作,并且要把操作结果保存到镜像里
使用 docker commit 指令,把一个正在运行的容器,直接提交为一个镜像。commit 是提交的意思,类似告诉svn服务器我要生成一个新的版本。
在容器内部新建了一个文件:
# docker exec -it 4ddf4638572d /bin/sh
# touch test.txt
# exit
# docker commit 4ddf4638572d wing/helloworld:v2
将这个新建的文件提交到镜像中保存
例:
# docker commit -m "my images version1" -a "wing" 108a85b1ed99 daocloud.io/ubuntu:v2
-m 添加注释
-a 作者
108a85b1ed99 容器环境id
daocloud.io/ubuntu:v2 镜像名称:hub的名称/镜像名称:tag
-p,–pause=true 提交时暂停容器运行Init 层的存在,是为了避免执行 docker commit 时,把 Docker 自己对 /etc/hosts 等文件做的修改,也一起提交掉。