小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
5. 容器管理
5.1 启动第一个容器
5.1.1 交互式的容器
// 交互式启动并进入容器(-it)
docker container run -it cf49811e3cdb
// 查看版本
cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
// 查看容器
# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3e700d88756d cf49811e3cdb "/bin/bash" 2 minutes ago Up 2 minutes practical_carson
-
CONTAINER ID:容器的唯一号码 -
NAMES:容器的名字(默认自动生成,也可以手工指定,但是不可以重复) -
STATUS:容器的运行状态 -
Up:一直运行
-
Exited:停止运行
-
docker container ls -a
新启动一个容器,并指定名字:
docker container run -it --name='wys_centos75' cf49811e3cdb
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c0b22080dc73 cf49811e3cdb "/bin/bash" 37 seconds ago Up 36 seconds wys_centos75
3e700d88756d cf49811e3cdb "/bin/bash" 2 hours ago Up 2 hours practical_carson
5.1.2 守护式容器(-d)
docker run -d --name="wys_nginx" nginx
查询容器的详细信息
docker container inspect wys_nginx
"IPAddress": "172.17.0.4",
测试是否能够连接:
curl -i 172.17.0.4
5.1.3 容器的应用场景
-
交互式的容器:工具类:开发、测试、临时性的任务
-
使用
--rm,在退出容器自动删除:docker container run -it --name='wys_centos' --rm cf49811e3cdb -
使用
docker container rm f9d743f44a73手动删除 -
守护式容器:网络服务
-
使用
-p实现对外端口映射:docker run -d -p 8084:80 --name='wys_nginx_80' nginx -
curl 82.156.85.205:8084
5.1.4 容器的启动/关闭/连接
- 守护式容器关闭和启动
docker container stop 5a2afb57c623
docker container start 5a2afb57c623
- 交互式容器关闭和启动
docker container stop 5a2afb57c623
docker container start -i 5a2afb57c623
- 容器的连接方法
docker container attach 1f02bc653d8d
- 子进程的方式登录(在已有工作容器中生成子进程,做登录,可以进行容器的调试,退出时也不会影响当前容器)
docker container exec -it 1f02bc653d8d /bin/bash
- 容器的后台及前台运行:
-
ctrl + P,Q。attach 调用到前台
-
调用 死循环
-
让程序前台一直运行(夯在前台)
-
制作守护式容器时,常用的方法
-
例如 nginx
-
docker container run --name="test_nginx" nginx -
docker container ls -a --no-trunc -
COMMAND:
nginx -g 'daemon off
5.2 docker 容器的网络访问
注:各个 docker 镜像之间是可以互相连接的。
指定映射(docker 会自动添加一条 iptables 规则来实现端口映射)
-
-p hostPort:containerPort
-
-p ip:hostPort:containerPort
-
-p ip::containerPort(随机端口,32768~60999)
-
-p hostPort:containerPort/udp
-
-p 81:80 443:443
- 端口号(重要)
docker container run -d -p 8080:80 --name='wys_nginx_hostPort' nginx
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
619aa8191667 nginx "/docker-entrypoin..." 6 seconds ago Up 6 seconds 0.0.0.0:8080->80/tcp wys_nginx_hostPort
- IP + 端口(重要)
docker container run -d -p 172.21.0.3:8081:80 --name='wys_nginx_ip_host' nginx
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db16d3a629a7 nginx "/docker-entrypoin..." About a minute ago Up About a minute 172.21.0.3:8081->80/tcp wys_nginx_ip_host
- 随机端口(从 32768 开始)
docker container run -d -p 80 --name='wys_nginx_random' nginx
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fa3c030cf3de nginx "/docker-entrypoin..." 6 seconds ago Up 5 seconds 0.0.0.0:32768->80/tcp wys_nginx_random
- 指定 IP + 随机端口
docker container run -d -p 172.21.0.3::80 --name='wys_nginx_ip_random_host' nginx
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c5c57824c5b9 nginx "/docker-entrypoin..." 27 seconds ago Up 26 seconds 172.21.0.3:32769->80/tcp wys_nginx_ip_random_host
- udp
docker container run -d -p 5555:53/udp --name='wys_nginx_udp' nginx
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
454aa56173e8 nginx "/docker-entrypoin..." 19 seconds ago Up 18 seconds 80/tcp, 0.0.0.0:5555->53/udp wys_nginx_udp
- 多端口映射
docker container run -d -p 33060:3306 -p 443:443 --name='wys_nginx_ports' nginx
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3453557c453b nginx "/docker-entrypoin..." 5 seconds ago Up 4 seconds 80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:33060->3306/tcp wys_nginx_ports
5.3 容器的其他管理
- 查看容器 ID
docker container ls -a -q = docker ps -a -q
-l:根据创建时间,获取最新的一个 container 的容器 ID
docker container ls -a -q -l
top:容器外部管理工具
[root@VM-0-3-centos ~]# docker container top 3453557c453b
UID PID PPID C STIME TTY TIME CMD
root 32608 32592 0 14:50 ? 00:00:00 nginx: master process nginx -g daemon off;
101 32646 32608 0 14:50 ? 00:00:00 nginx: worker process
logs:查看日志
docker container logs db16d3a629a7
logs -f:增量监控日志(类似于 tail -f)
docker container logs -f db16d3a629a7
-t:更加详细,增加时间戳信息
docker container logs -tf db16d3a629a7
--tail:查看最后几条日志
docker container logs -tf --tail 10 db16d3a629a7
5.3.1 小结
镜像
search
pull
ls
inspect
rm
save
load
容器(基础操作)
run
ls
start
stop
restart
kill
attch
exec
top
logs
inspect
5.4 docker 的数据卷实现持久化存储
比如我们启动一个 nginx:
docker run -d --name='nginx' -p 80:80 nginx
然后我们在本地访问 nginx:
http://82.156.85.205/
发现可以正常访问,假设我们想改 nginx 的欢迎页面,我们先登录到 nginx 上。
docker container exec -it ab7b45d1ebf2 /bin/bash
然后我们修改文件,文件在 /usr/share/nginx/html 目录下:
cd /usr/share/nginx/html
很遗憾,我们不能使用 vim 修改文件,我们只能使用 echo,cat 这种命令。
还好,docker 给我们提供了 cp 命令。我们使用 cp 命令来讲宿主机上的文件 copy 到容器中。我们来看下 cp 命令:
docker cp --help
Usage: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
我们来将本地的一个文件复制到 docker 容器上:
cd /tmp
echo "hello" > index.html
docker cp index.html nginx:/usr/share/nginx/html
再次访问发现内容变了。
同样,我们也可以将 docker 中文件 copy 到宿主机。
docker cp nginx:/usr/share/nginx/html/50x.html ./
5.4.1 手工交互数据
总结一下,上面的内容就是手工交互数据:
docker cp index.html nginx:/usr/share/nginx/html
docker cp nginx:/usr/share/nginx/html/50x.html ./
但是这样有个问题,假设我们有很多容器,难道我们要一个一个修改吗?我们有没有什么方法,在宿主机上修改了,容器上也对应自动修改了呢?
当然有的,就是我们下面要讲的内容。
5.4.2 Volume 实现宿主机和容器的数据共享
- 文件准备
mkdir -p /opt/html
cp /tmp/*.html /opt/html/
cd /opt/html/
ll
总用量 8
-rw-r--r-- 1 root root 494 3月 1 12:00 50x.html
-rw-r--r-- 1 root root 6 3月 1 12:00 index.html
cat index.html
hello
- 文件映射
docker run -d --name='nginx_v' -p 80:80 -v /opt/html:/usr/share/nginx/html nginx
- 登录测试
docker container exec -it nginx_v /bin/bash
cd /usr/share/nginx/html/
ls -al
-
我们在宿主机上修改,看一看能够在容器中对应修改:
-
在宿主机中,我们将 index.html 文件内容改为 hello world,在 docker 容器对应的 index.html 文件中也改为了 hello world
作用:数据持久化
例子:开启两个 nginx 容器(90,91)。实现负载均衡,共同挂载一个数据卷,实现静态资源共享。
docker container run -d -p 90:80 --name='nginx_volume1' nginx
docker container run -d -p 91:80 --name='nginx_volume2' -v /opt/html:/usr/share/nginx/html nginx
docker container run -d -p 92:80 --name='nginx_volume3' -v /opt/html:/usr/share/nginx/html nginx
91、92 端口共享同一份文件
我们测试访问一下:

- 查看数据卷对应的文件、位置。比如说我们想查看 nginx_volume3 的。
docker container inspect nginx_volume3
其中有一块重要的信息
"Mounts": [
{
"Type": "bind",
"Source": "/opt/html",
"Destination": "/usr/share/nginx/html",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
Mounts 中写着宿主机中源目录和 docker 中目标目录。
如果我们想要挂载多个目录,比如又要挂载数据,又要挂载日志等等,我们可以使用多个 -v 参数,比如:
docker run -it --name "httpd_valumes" -v /opt/volume/a:opt/a -v /opt/volume/b:opt/b contos:6.9 /bin/bash
5.4.3 创建数据卷容器
- 在宿主机创建目录,模拟数据目录
mkdir -p /opt/volume/a
mkdir -p /opt/volume/b
touch /opt/volume/a/a.txt
touch /opt/volume/b/b.txt
- 启动数据卷容器
docker run -it --name="nginx_volumes" -v /opt/volume/a:/opt/a -v /opt/volume/b:/opt/b centos:6.9 /bin/bash
-
测试是否挂载成功,查看一下
/opt下是否有对应目录。退出有ctrl p q退出。 -
使用数据卷容器
docker run -d -p 8081:80 --volumes-from nginx_volumes --name='nginx_8081' nginx
docker run -d -p 8082:80 --volumes-from nginx_volumes --name='nginx_8082' nginx
- 查看 nginx 中是否已经有了对应目录。
docker container exec -it nginx_8081 /bin/bash
cd /opt/
ls
a b
-
作用:
-
在集中管理集群中,大批量的容器都需要挂载相同的多个数据卷时,可以采用数据卷容器进行统一管理