基础入门
-
运行我们第一个容器
sudo docker run -i -t ubuntu /bin/bash
-i
标志保证容器中STDIN
是开启的。
-t
标志告诉Docker为要创建的容器分配一个伪tty终端。
这样,新创建的容器才能提供一个交互式shell,若要在命令行下创建一个我们能与之进行交互的容器,而不是一个运行后台服务的容器,则这两个参数是最基本的参数。ubuntu
告诉Docker基于什么镜像来创建容器,示例中使用的是ubuntu镜像。Docker 会检查本地是否存在ubuntu镜像,如果本地没有该镜像,那么Docker就会连接Docker官方维护的Docker Hub Registry,查看Docker Hub 中是否有该镜像,Docker一旦找到该镜像,就会下载该镜像并将其保存到本地宿主机中。随后,Docker在文件系统内部用这个镜像创建了一个新容器,该容器拥有自己的网络,IP地址,以及一个用来和宿主机进行通信的桥接网络接口。
最后,
/bin/bash
命令告诉Docker在新容器中要运行什么命令,这里是启动一个Bash shell。 -
列出docker容器
docker ps # 列出当前正在运行的容器 docker ps -a # 列出所有容器,包括正在运行和已经停止的 docker ps -l # 列出最后一个运行的容器 docker ps -n x # 列出最后x个容器,不管正在运行还是已经停止 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 容器ID 创建容器的镜像 容器最后执行的命令 容器创建时间 容器退出状态 容器名称
-
容器命名
docker run --name xx -i -t ubuntu /bin/bash
使用
--name
给容器命名,容器的命名必须是唯一的,如果要使用的容器已经存在,可以先用docker rm
命令删除已有的同名容器后,再来创建新的容器。 -
端口映射
在网络模式下,使用-p
指定端口映射,格式为:宿主端口:容器端口docker run -p 6379:6379 --name redis-master -d redis redis-server /etc/redis/redis.conf/conf
-d
表示Docker会将容器放到后台运行,redis 表示使用的是redis 镜像,redis-server /etc/redis/redis.conf/conf
表示启动容器执行的命令。 -
挂载物理机的目录到容器中
使用-v
将物理机的目录挂载到容器中,格式为: <host path>:<container path>docker run -p 6379:6379 --name redis-master -v /redis-master/redis-conf/redis.conf:/etc/redis/redis.conf \ -v /redis-master/data:/data \ -d redis \ redis-server /etc/redis/redis.conf/conf
注意这里物理机的目录必须为绝对路径,如果需要使用当前目录,可使用
pwd
docker run -p 6379:6379 --name redis-master -v `pwd`/redis-master/redis-conf/redis.conf:/etc/redis/redis.conf \ -v `pwd`/redis-master/data:/data \ -d redis \ redis-server /etc/redis/redis.conf/conf
也可以将物理机的文件挂载到到容器中
-
拷贝文件到容器中
将物理主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下:docker cp /www/runoob 96f7f14e99ab:/www/
将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为xxx:
docker cp /www/runoob 96f7f14e99ab:/xxx
将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录下:
docker cp 96f7f14e99ab:/www /tmp/
-
停止/启动/重启容器
-
stop
docker stop bob_the_container
容器在docker host中实际上就是一个进程,
docker stop
命令本质上是向该进程发送一个SIGTERM
信号,如果想快速停止容器,可使用docker kill
命令,其作用是向容器进程发送SIGKILL
信号。SIGTERM
和SIGKILL
信号区别? -
start
docker start bob_the_container # 通过容器名称启动 docker start aa3f365f0f4e # 通过ID启动已经停止运行的容器
docker start
会保留容器的第一次启动时的所有参数。 -
restart
docker restart bob_the_container
docker restart
其作用是依次执行docker stop
和docker start
命令。
容器可能会因为某种错误而停止运行,对于服务类容器,我们希望它能自动重启。docker run --restart=always -d httpd # 总是自动重启 docker run --restart=on-failure:3 -d httpd # 尝试重启3次
-
-
暂停容器
有时希望可以让容器暂停工作一段时间,比如要给容器的文件系统打快照,这时可以执行docker pause
docker pause daemon_dave
处于暂停状态的容器不会占用CPU资源,直到通过
docker unpause
恢复运行docker unpause daemon_dave
-
创建守护式容器
上面创建的是交互式运行的容器,平常更适合的是创建守护式容器,它没有交互会话,非常适合来运行应用程序和服务。docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
-d
表示Docker会将容器放到后台运行。 -
在容器内部运行进程
在容器内运行的进程有2种类型:后台任务和交互式任务。后台任务在容器内运行且没有交互需求,而交互式任务则保持在前台运行。我我们可以通过
docker exec
命令可以在容器内部额外启动新进程。docker exec -d daemon_dave touch /etc/new_config_file # -d表示后台任务 docker exec -t -i daemon_dave /bin/bash
-d
标志之后,指定的是要在内部执行这个命令的容器以及要执行的命令。
通过docker exec
后台命令,可以在正在运行的容器中进行维护,监控及管理任务。 -
跟踪容器内部
在后台运行的守护型容器,我们可以通过docker logs
命令来获取容器的控制台输出。docker logs daemon_dave # 默认显示最后几行日志输出 docker logs -f damon_dave # 实时跟踪 docker logs -ft daemon_dave # -t 加上时间戳 docker logs --tail 10 damon_dave # 获取日志的最后10行内容
-
查看容器内的进程
docker top daemon_dave
-
查看容器的统计信息
docker stats daemon_dave CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O PIDS 3804b59f55f5 0.04% 457.9MiB / 1.797GiB 24.89% 7MB / 273 kB 3.04MB / 34.3MB 23 .....
可以监控容器的CPU,内存,网络I/O,存储I/O的性能和指标。
-
删除容器
docker rm 80430fd8d0921 docker rm -f 80430fd8d0921 # 强制删除正在运行的容器 docker rm `docker ps -a -q` # 删除所有容器
-
获取所有容器的名称
# docker ps -a --format {{.Names}} goofy_keller hardcore_mirzakhani reverent_boyd dbslave dbmaster ...
容器中的时间问题
如果在启动Docker]容器的过程中没有单独配置localtime,很可能造成Docker容器时间与主机时间不一致的情况,一般可以使用宿主机的时间配置文件来解决,直接在docker 启动时将宿主机的文件映射至容器内:
docker run -it -v /etc/localtime:/etc/localtime centos /bin/sh
获取容器详细信息
docker inspect daemon_dave
-
获取容器的进程ID
docker inspect -f '{{.State.Pid}}' daemon_dave
获取容器的目录映射信息
获取容器的网络信息
对容器进行资源限制
- 内存限制
- CPU限制
- Block IO 带宽限制
容器外执行某个容器内的某个命令
docker exec [docker id] /bin/bash -c "cd /home && pyhotn main.py"
或者执行shell命令
docker exec -ti obs1 /bin/bash -c "echo hello world"
在容器内部使用docker
docker run -ti --rm -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker ubuntu
查看容器和镜像占用的存储空间大小
docker system df -v
清理多余的空间
docker system prune -a
可以清除如下资源:
- 已停止的容器(container)
- 未被任何容器所使用的卷(volume)
- 未被任何容器所关联的网络(network)
- 所有悬空镜像(image)
该命令需要谨慎使用,有可能破坏容器的存储层,造成容器启动失败。
使用runlike 查看容器启动参数
使用 docker run 启动容器,时间长了,就忘记当初启动是添加了什么参数。如果要查看当前添加了什么参数
使用前需要安装runlike插件
pip install runlike
然后使用runlike -p 容器名 or 容器ID