一、创建容器常用选项
1.1常用选项如下表:
选项 描述
-i, --interactive 交互式
-t, --tty 分配一个伪终端
-d, --detach 运行容器到后台
-e, --env 设置环境变量
-p, --publish list 发布容器端口到主机
-P, --publish-all 发布容器所有EXPOSE的端口到宿主机随机端口
--name string 指定容器名称
-h, --hostname 设置容器主机名
--ip string 指定容器IP,只能用于自定义网络
--network 连接容器到一个网络
--mount mount 将文件系统附加到容器
-v, --volume list 绑定挂载一个卷
--restart string 容器退出时重启策略,默认no
1.2实例演示:
创建nginx容器:
[root@localhost ~]# docker container run -d nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
be8881be8156: Pull complete
32d9726baeef: Pull complete
87e5e6f71297: Pull complete
Digest: sha256:6ae5dd1664d46b98257382fd91b50e332da989059482e2944aaa41ae6cf8043a
Status: Downloaded newer image for nginx:latest
e7155844c2a27d9a9beb52307fba95c63fbaeec4aa8adaecc8e30c6968209e9c
列出当前正在运行的容器:
[root@localhost ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e7155844c2a2 nginx "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes 80/tcp priceless_jones
字段说明:
CONTAINER ID - 随机生成的容器ID
IMAGE - 基于哪个镜像创建的
COMMAND - 启动容器运行的命令
CREATED - 创建时间
STATUS - 运行状态
列出所有容器,包括已停止的:
[root@localhost ~]# docker container ls -a
指定容器名称、主机名和设置环境变量:
[root@localhost ~]# docker container run -d --name nginx01 -e TEST=123 -h nginx01 nginx
dd29208fbfd70eec6797d523a4ef8436ebd6f6818d89c139a949f15fafabc38c
[root@localhost ~]#
[root@localhost ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd29208fbfd7 nginx "nginx -g 'daemon of…" 13 seconds ago Up 12 seconds 80/tcp nginx01
e7155844c2a2 nginx "nginx -g 'daemon of…" 8 minutes ago Up 8 minutes 80/tcp priceless_jones
[root@localhost ~]#
[root@localhost ~]# docker container exec -it nginx01 bash
root@nginx01:/#
root@nginx01:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@nginx01:/# echo $TEST
123
容器创建了,怎么让用户访问呢?那就用到-p选项了,从宿主机暴露一个端口到容器:
[root@localhost ~]# docker container run -d --name nginx02 -p 88:80 nginx
a5e10362acc39efcdd8d3dccdca0b8ae8dd1bb824c259a3ebada70ec73b8b6e4
[root@localhost ~]#
[root@localhost ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a5e10362acc3 nginx "nginx -g 'daemon of…" 18 seconds ago Up 17 seconds 0.0.0.0:88->80/tcp nginx02
dd29208fbfd7 nginx "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes 80/tcp nginx01
e7155844c2a2 nginx "nginx -g 'daemon of…" 12 minutes ago Up 12 minutes 80/tcp priceless_jones
[root@localhost ~]#
此时多个一个PORTS字段,代表宿主机监听0.0.0.0的88端口,转发到该容器80端口。
打开浏览器输入:http://宿主机IP:88
下面设置允许容器nginx03最多使用50M内存和30M的SWAP,并禁用OOM Killer
[root@localhost ~]# docker container run -d --name nginx03 --memory="50m" --memory-swap="80m" --oom-kill-disable nginx
8cb80b28450d05e1e3cd5437b73bb791daa6603412961fb6da55b78f66d69ad7
[root@localhost ~]#
开启,关闭,重启,删除容器:
[root@localhost ~]# docker container stop nginx03
停止容器nginx03
[root@localhost ~]# docker container start nginx03
重启容器
[root@localhost ~]# docker container restart nginx03
删除一个容器:
[root@localhost ~]# docker container rm nginx03
Error response from daemon: You cannot remove a running container 8cb80b28450d05e1e3cd5437b73bb791daa6603412961fb6da55b78f66d69ad7. Stop the container before attempting removal or force remove
[root@localhost ~]#
[root@localhost ~]# docker stop nginx03
nginx03
[root@localhost ~]# docker container rm nginx03
nginx03
使用 docker stats 查看当前容器内存限制及使用:
[root@localhost ~]# docker stats --no-stream nginx03
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
8cb80b28450d nginx03 0.00% 3.98MiB / 50MiB 7.96% 648B / 0B 0B / 0B 0
[root@localhost ~]#
[root@localhost ~]# docker stats nginx02
查看nginx02容器的实时的内存,网络I/O CPU, 磁盘IO的使用情况
CPU限额:
允许容器最多可以使用一个半的CPU:
docker container run -d --name nginx01 --cpus=".5" --memory="50m" --memory-swap="80m" --oom-kill-disable nginx
建议:设置-memory再禁用OOM Killer,CPU使用不超过50%。
2、管理应用程序数据
前面讲到过容器删除,容器里产生的数据也会删除,并且在容器里操作是在可写层,会经过存储驱动管理,这种额外的抽象会降低性能。
容器的可写层存储数据,有一些缺点:
A、当容器停止运行时,数据将不会持续存在,如果另一个进程需要这些数据,则很难将数据从容器中取出。并且容器删除后,数据也会随着删除。
B、容器的可写层与容器运行的宿主机紧密耦合,无法轻松地将数据移动到其他地方。
C、容器的可写层需要存储驱动程序来管理文件系统。存储驱动程序使用Linux内核提供的联合文件系统,与直接在宿主机上写入文件相比,这种额外的抽象会降低性能。
Docker提供三种方式将数据从宿主机挂载到容器中:
D、volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。
E、bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。
F、 tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用tmpfs,同时避免写入容器可写层提高性能。
2.1 volumes
特点:
A、多个运行容器之间共享数据。
B、当容器停止或被移除时,该卷依然存在。
C、多个容器可以同时挂载相同的卷。
D、当明确删除卷时,卷才会被删除。
管理卷:
[root@localhost ~]# docker volume create nginx-vol
nginx-vol
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local nginx-vol
[root@localhost ~]# docker volume inspect nginx-vol
[
{
"CreatedAt": "2018-08-05T05:05:51+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
"Name": "nginx-vol",
"Options": {},
"Scope": "local"
}
]
[root@localhost ~]# cd /var/lib/docker/volumes/nginx-vol/_data
[root@localhost _data]# ls
运行一个容器使用上面创建的卷:
[root@localhost _data]# docker container run -d --name=nginx-vol --mount source=nginx-vol,destination=/usr/share/nginx/html nginx
7587ed948f95eb885a2bd5e2739da2d7e767e0efed01d9c69685ce4b83521c7b
[root@localhost _data]# ls /var/lib/docker/volumes/nginx-vol/_data
50x.html index.html
[root@localhost _data]# docker container exec -it nginx-vol bash
root@7587ed948f95:/#
root@7587ed948f95:/# cd /usr/share/nginx/html
root@7587ed948f95:/usr/share/nginx/html# ls
50x.html index.html
root@7587ed948f95:/usr/share/nginx/html# pwd
/usr/share/nginx/html
可以看到容器中的数据已经存储到了nginx-vol数据卷中:
注:-v选项在早期Docker版本已经支持,而--mount是在17 CE版本后才引入的选项,初学者建议使用--mount。
清理:
[root@localhost _data]# docker container stop nginx-vol
nginx-vol
[root@localhost _data]# docker container rm nginx-vol
nginx-vol
[root@localhost _data]# docker volume rm nginx-vol
nginx-vol
[root@localhost _data]# docker volume ls
DRIVER VOLUME NAME
也可以使用NFS外部存储,例如:
[root@localhost opt]# docker volume create --driver local --opt type=nfs --opt o=addr=192.168.0.10,rw --opt device=:/opt/container_data nginx-vol
2.2bind mounts
特点:
A、从主机共享配置文件到容器。
B、在Docker主机上的开发环境和容器之间共享代码。
C、当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时。
运行一个容器挂载宿主机目录:
[root@localhost ~]# mkdir -p /app/wwwroot
[root@localhost ~]# docker container run -d --name=nginx-bind --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx
a35a2407b7c10f82d8431fe83bbd68a3fea1680823facec5b634f9de0f7f5db1
[root@localhost ~]#
或者:
docker container run -d --name=nginx-bind -v /app/wwwroot:/usr/share/nginx/html nginx
验证绑定:
[root@localhost ~]# docker container inspect nginx-bind|grep -A 9 Mounts
"Mounts": [
{
"Type": "bind",
"Source": "/app/wwwroot",
"Target": "/usr/share/nginx/html"
}
],
"MaskedPaths": [
"/proc/acpi",
"/proc/kcore",
--
"Mounts": [
{
"Type": "bind",
"Source": "/app/wwwroot",
"Destination": "/usr/share/nginx/html",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
[root@localhost ~]#
验证测试:
[root@localhost ~]# cd /app/wwwroot/
[root@localhost wwwroot]# echo 123456 >>test001
[root@localhost wwwroot]# cat test001
123456
[root@localhost wwwroot]# docker container exec -it nginx-bind bash
root@a35a2407b7c1:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@a35a2407b7c1:/# cd usr/share/nginx/html/
root@a35a2407b7c1:/usr/share/nginx/html# ls
test001
root@a35a2407b7c1:/usr/share/nginx/html# cat test001
123456
参考博文链接:https://blog.51cto.com/13659253/2156975