#01 检查Docker是否正常运行
使用docker info命令产看容器信息、检查容器是否正常运行:
docker info # 该命令返回容器概述、镜像概述、执行驱动、存储驱动、基本配置
#02 运行第一个容器
使用docker run命令来运行容器。实际上,它执行了容器的创建和容器的启动:
#!/bin/sh docker run -i -t ubuntu /bin/bash
#03 使用第一个容器
容器相当与一个操作系统,一个“完整”的操作系统。
如果退出,则容器会停止运行。
#04 容器命名
在运行容器时,使用–name选项指定容器名,否则会生成一个随机的名字。
合法字符:[A-z0-9_.-]
可以通「过容器名」替代「容器ID」,可以非常清楚的分辨容器。
「容器名」必须是唯一,如果容器名已经存在,则应该使用docker rm命令删除已经存在的容器。
#05 重新启动已停止的容器
使用docker start <container name/id>命令来启动容器。
或者可以使用docker restart <container name/id>命令来重新启动容器。
使用docker ps命令查看运行中的容器。
可以使用docker create命令来创建一个容器,但是并不运行,这个可以在工作流中进行细粒度的控制。
#06 附着到容器上
可以使用docker attach命令附着到该容器的会话上。
但是,如果退出(Ctrl+C, Ctrl+D),即进程退出,容器则会停止运行。在退出容器时,可以利用Ctrl+P Ctrl+Q进行退出,以守护式形式退出容器,但容器的守护进程依旧在运行,之后可以使用docker attach命令进入容器。
#07 创建守护进程式容器
如果进程退出,则容器也会退出。所以,如果要创建守护进程式的容器,则需要在容器内创建一个能一直运行的进程。
docker run --name container_name -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
选项-d是容器在后台运行,这使得主机控制台不会附着到新的shell会话上,而是仅仅返回一个容器ID而已。使用docker ps查看当前正在运行的容器。
#10 查看容器内的进程
使用docker top命令查看容器内的进程。
#11 查看统计信息
使用docker stats命令查看容器统计信息。
它显示了容器的CPU、内存、网络I/O、存储I/O的统计信息。
#12 在容器内部运行进程
使用docker exec命令在容器内部运行进程。
容器内的进程分为两种:后台任务;交互任务。后台任务运行与后台,不需要交互,而交互任务,则是在前台运行的,需要与用户进行交互。
使用docker exec可以对正在运行的容器进行一系列的维护、监控、管理操作。
从Docker 1.7开始,可以使用-u选项指定运行进程的所属用户。
后台任务:docker exec -d container_name touch /etc/foo.conf
交互任务:docker exec -i -t container_name /bin/bash
#13 停止容器
使用docker stop命令来停止容器。该命令向容器进程发送SIGTERM信号。
或者使用docker kill命令来结束容器。该命令向容器进程发送SIGKILL信号。
#14 自动重启容器
在Docker 1.2.0中引入了--restart选项。使用该选项后,当容器停止时,会判断退出码,决定是否要重启容器。
docker run –restart=always –name container_name -d ubuntu /bin/bash -c “while true; do sleep 1; echo hello world; done”
上述命名中,只要容器停止,则会重启动起。使用--restart=on-failure表示退出码非零时才重启。并且on-failure还支持一个重启次数,例如--restart=on-failure:5表示最多重启五次。
#15 深入容器
除了使用docker ps命令来获取容器信息,还可以使用docker inspect来获取更过的容器信息。
可以配合–format选项来输出指定字段:docker inspect --format='{{.NetworkSettings.SandboxID}}' 1d5960ba4e69
选项–format支持Go语言的模板,可以使用Go语言模板的优势。
也可以通过浏览/var/lib/docker/来了解Docker的工作原理,该目录中存放着Docker的镜像,容器,容器配置。所有的容器都保存在/var/lib/docker/containers/下。
#16 删除容器
通过使用docker rm命令来删除容器。
使用docker rm -f来强制删除运行中的容器,之前的版本必须使用docker stop或docker kill命令来停止容器。
使用docker rm $(docker ps -a -q)来删除所有的容器。
## 常用的容器操作
下载镜像:docker pull
在Docker Hub上查找可用的Image映像
Docker Hub
# docker pull centos:6.10
查看镜像:docker images
安装Docker和下载images镜像和常用Docker命令
# docker images centos
容器列表:docker ps [OPTIONS]
可看到我们创建过的所有容器
# docker ps -a
启动容器:docker start [OPTIONS] CONTAINER [CONTAINER..]
启动一个已经停止的容器
# docker start 026e
重启容器:docker restart [OPTIONS] contains[CONTAINER]
重启一个正在运行的容器
# docker restart 026e
停止容器:docker kill [OPTIONS] CONTAINER [CONTAINNER…]
停止一个正在运行的容器
# docker kill 026e
进入容器:docker attach
Docker容器进入的4种方式。使用docker attach进入容器
# docker attach 44fc0f0582d9
退出容器:exit
Correct way to detach from a container without stopping it
使用快捷键组合序列Ctrl+p, Ctrl+q退出。
重命名仓库:docker tag
没有直接重命名「仓库」的命令,但是可以通过docker tag命令来进行这个操作:
# docker tag server:latest myname/server:latest
# docker rmi server
最后,删除原有的「仓库」。
「TAG」是「镜像名(镜像ID)」的可读别名,它标记「仓库」的版本
「Docker how to change repository name or rename image?」
## 运行「docker run hello-world」后……
Docker Client —> Docker Daemon <—> Docker Hub
| | —> Image
| |
Output <— new Container <—|
#!/bin/bash # docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 1b930d010525: Pull complete Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
清除未使用的卷
「How To Remove Docker Containers, Images, Volumes, and Networks」
清除没有使用的卷:docker system prune –volumes
镜像保存和载入
Docker镜像保存save、加载load
How to see docker image contents
有时候某些镜像无法下载,可以先 docker save 为 tar 文件,然后将 tar 文件 docker load 到本地中。
有时候我们需要查看镜像内容。通常运行它,然后使用ls命令即可。但是某些镜像并不包含这些命令,比如traefik:1.7.14镜像。我们可以使用dive命令查看,或者docker save然后使用tar命令解压。
向运行中的容器添加卷
-「How can I add a volume to an existing Docker container?」
方法一:先docker commit容器,然后重新创建容器,创建镜像的时候使用-v选项添加卷;
方法二:使用docker cp命令向容器中复制文件;
方法三:基于块设备的高级玩法:「~jpetazzo/Attach a volume to a container while it is running」
删除所有停止的容器
# docker container rm $(docker container ls -a -q)
查看镜像的CMD和ENTRYPOINT值
「How can I determine ENTRYPOINT & CMD are on an image?」
# docker image inspect <image id>
# 当–net=host时
「Ports aren’t showing up in docker ps, and are failing for registrator. #15537」
使用主机网络时,端口映射没有用处的,因为容器正在使用主机的网络堆栈。
就是说,当你的应用程序在监听端口时,它正在侦听主机的端口。
# 构建镜像是忽略文件
「COPY with docker but with exclusion」
相关链接
「Docker Tip #10: Project Structure with Multiple Dockerfiles and Docker Compose」
「Best practices for writing Dockerfiles」
「Use multi-stage builds」
参考文献
Remove Untagged Images From Docker