docker 学习(2)—— 容器管理

222 阅读8分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

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

  • 容器的后台及前台运行:
  1. ctrl + P,Q。attach 调用到前台

  2. 调用 死循环

  3. 让程序前台一直运行(夯在前台)

  4. 制作守护式容器时,常用的方法

  5. 例如 nginx

  6. docker container run --name="test_nginx" nginx

  7. docker container ls -a --no-trunc

  8. 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

  1. 端口号(重要)

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

  1. 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

  1. 随机端口(从 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

  1. 指定 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

  1. 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

  1. 多端口映射

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 端口共享同一份文件

我们测试访问一下:

test_column

  • 查看数据卷对应的文件、位置。比如说我们想查看 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 创建数据卷容器

  1. 在宿主机创建目录,模拟数据目录

mkdir -p /opt/volume/a

mkdir -p /opt/volume/b

touch /opt/volume/a/a.txt

touch /opt/volume/b/b.txt

  1. 启动数据卷容器

docker run -it --name="nginx_volumes" -v /opt/volume/a:/opt/a -v /opt/volume/b:/opt/b centos:6.9 /bin/bash

  1. 测试是否挂载成功,查看一下 /opt 下是否有对应目录。退出有 ctrl p q 退出。

  2. 使用数据卷容器


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

  1. 查看 nginx 中是否已经有了对应目录。

docker container exec -it nginx_8081 /bin/bash

cd /opt/

ls

a b

  1. 作用:

  2. 在集中管理集群中,大批量的容器都需要挂载相同的多个数据卷时,可以采用数据卷容器进行统一管理