一、创建容器常用选项

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