创建容器的工作原理:

当利用docker run来创建容器时,Docker在后台运行的标准操作包括:检查本地是否存在指定的镜像,不存在就从公有仓库下载,利用镜像创建并启动一个容器分配一个文件系统,并在只读的镜像层外面挂在一层可读写层;从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去;从地址池配置一个ip地址给容器;执行用户指定的应用程序,执行完毕后容器被终止。

注:容器不是一个虚拟机,因为他就是一个进程,如果我们退出,这个进程就退出了。

创建容器的常用选项:

指令 描述

-i, --interactive                交互式

-t, --tty                        分配一个伪终端

-d, --detach                     运行容器到后台

-a, --attach list                附加到运行的容器

--dns list                       设置DNS服务器

-e, --env list                   设置环境变量

--env-file list                  从文件读取环境变量

-p, --publish list               发布容器端口到主机

-P, --publish-all                发布容器所有EXPOSE的端口到宿主机随机端口

-h, --hostname string            设置容器主机名

--ip string                      指定容器IP,只能用于自定义网络

--link list                      添加连接到另一个容器

--network                        连接容器到一个网络

--mount mount                    挂载宿主机分区到容器

-v, --volume list                挂载宿主机目录到容器

--restart string                 容器退出时重启策略,默认no[always|on-failure]

--add-host list                  添加其他主机到容器中/etc/hosts

创建一个bs容器,并在后台运行。

[root@linux-docker01 ~]# docker container run -itd --name bs busybox

0490de553573ae9d30ca68a15a901e2b8c150528a11248c832ac36e42d5a41b4

进入到bs容器里面

[root@linux-docker01 ~]# docker container attach bs #如果退出不终止容器的话,按Ctrl+p+q即可

/ #

创建bs1容器并传入a变量

[root@linux-docker01 ~]# docker container run -itd -e a=123 --name bs1 busybox

d46fd062fd659f712b8128aa4706389317d32ed64b885b38efd8a068739bf655

[root@linux-docker01 ~]# docker exec -it bs1 sh

/ # echo $a

123

运行nginx01容器,并分配容器端口为80,与宿主机8080端口作为映射。

[root@linux-docker01 ~]# docker container run -itd -p 8080:80 --name nginx01 nginx

8b90babd6f7a2042bb1121ed11b048bbf9f382be31426f51f94aae8445b8c844

[root@linux-docker01 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

8b90babd6f7a nginx "nginx -g 'daemon of…" 18 seconds ago Up 17 seconds 0.0.0.0:8080->80/tcp nginx01

资源限制命令:

指令 描述

-m,--memory                  容器可以使用的最大内存量

--memory-swap                 允许交换到磁盘的内存量

--memory-swappiness=<0-100>   容器使用SWAP分区交换的百分比(0-100,默认为-1)

--memory-reservation          内存软限制,Docker检测主机容器争用或内存不足时所激活的软限制,使用此选项,值必须设置低于—memory,以使其优先

--oom-kill-disable            当宿主机内存不足时,内核会杀死容器中的进程。建议设置了-memory选项再禁用OOM。如果没有设置,主机可能会耗尽内存

--cpus                        限制容器可以使用多少可用的CPU资源

--cpuset-cpus                 限制容器可以使用特定的CPU

--cpu-shares                  此值设置为大于或小于默认1024值,以增加或减少容器的权重,并使其可以访问主机CPU周期的更大或更小比例

管理容器的常用选项:

指令 描述

ls                            列出容器

inspect                       显示一个或多个容器详细信息

attach                        附加本地标准输入,输出和错误到一个运行的容器

exec                          在运行容器中执行命令

commit                        创建一个新镜像来自一个容器

cp                            拷贝文件/文件夹到一个容器

logs                          获取一个容器日志

port                          列出或指定容器端口映射

stats                         显示容器资源使用统计

top                           显示一个容器运行的进程

update                        更新一个或多个容器配置

stop/start                    停止/启动一个或多个容器

rm                            删除一个或多个容器

查看当前运行的容器

[root@linux-docker01 ~]# docker container ls

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

8b90babd6f7a nginx "nginx -g 'daemon of…" 3 days ago Up 3 days 0.0.0.0:8080->80/tcp nginx01

d46fd062fd65 busybox "sh" 3 days ago Up 3 days bs1

0490de553573 busybox "sh" 3 days ago Up 3 days bs

查看容器的详细信息

[root@linux-docker01 ~]# docker container inspect 0490de553573

使用attach命令进入容器时会卡住,是因为将当前linux标准的输入输出附加到nginx容器中,那么nginx容器中是运行有一个进程的,可以用top命令查看到nginx -g daemon off是运行在前台实时运行了。这是用attach命令附加标准的输入输出就会造成进程的堵塞,附加不进去,也一直就会等待。

[root@linux-docker01 ~]# docker attach nginx01

[root@linux-docker01 ~]# docker top nginx01

UID PID PPID C STIME TTY TIME CMD

root 12421 12409 0 14:55 pts/0 00:00:00 nginx: master process nginx -g daemon off;

101 12445 12421 0 14:55 pts/0 00:00:00 nginx: worker process

可以使用exec进入容器

[root@linux-docker01 ~]# docker exec -it nginx01 bash

拷贝宿主机的文件到容器中

[root@linux-docker01 ~]# docker container cp anaconda-ks.cfg bs1:/root

[root@linux-docker01 ~]# docker container exec bs1 ls /root/

anaconda-ks.cfg

查看容器的日志

[root@linux-docker01 ~]# docker logs 8b90babd6f7a

查看容器的端口

[root@linux-docker01 ~]# docker container port nginx01

80/tcp -> 0.0.0.0:8080

查看容器资源的实时利用率

[root@linux-docker01 ~]# docker stats nginx01

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS

8b90babd6f7a        nginx01             0.00%               1.348MiB / 3.685GiB   0.04%               648B / 0B           0B / 0B             2

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS

8b90babd6f7a        nginx01             0.00%               1.348MiB / 3.685GiB   0.04%               648B / 0B           0B / 0B             2

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS

8b90babd6f7a        nginx01             0.00%               1.348MiB / 3.685GiB   0.04%               648B / 0B           0B / 0B             2

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS

8b90babd6f7a        nginx01             0.00%               1.348MiB / 3.685GiB   0.04%               648B / 0B           0B / 0B             2

删除所有的容器

[root@linux-docker01 ~]# docker rm -f $(docker ps -q -a)