Docker容器
Posted 礁之
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker容器相关的知识,希望对你有一定的参考价值。
文章目录
一、容器的基本介绍
(1)容器的启动过程说明
- 检查本地是否存在镜像,如果没有就从指定的仓库下载,docker run也会下载,pull也是下载
- 利用镜像启动一个容器
- 分配一个文件系统,并在只读的镜像层外挂在一层可读层,镜像是只读的,容器是可读可写的
- 从宿主机配置的网桥接口中桥接一个虚拟接口到容器去
- 从地址池配置一个ip给容器
- 执行用户指定的程序
- 执行完毕后停止容器
(2)Docker run命令常用选项
Docker run启动并创建容器
选项 | 作用 |
---|---|
-t | 配置一个伪终端并且绑定到容器的标准输入上,一般是不加-d时使用 |
-i | 让容器的标准输入保持打开,即保持连接,一般是不加-d时使用 |
-d | 将容器放到后台运行 |
-c | 指定分配容器的cpu分片,即限制cpu使用率 |
-m | 指定分配该容器的内存大小,单位为b,k,m,g |
上面的选项可以组合使用
[root@docker ~]# docker inspect 97c9165c042d #查看容器的详细信息
(3)Docker ps命令常用选项
Docker ps查看当前正在运行的容器
选项 | 作用 |
---|---|
-a | 查看所以容器,包括停止的容器 |
-q | 只显示正在运行的容器的id |
-l | 查看最后一次创建的容器,容器必须是开启状态,否则什么也看不到 |
上面的选项可以组合使用
(4)删除容器命令
docker rm id或者name #删除指定容器,-f强制删除
二、查看Docker的基本信息
[root@docker ~]# systemctl start docker #开启Docker
[root@docker ~]# systemctl status docker #查看状态确认开启
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since 一 2021-07-19 11:59:55 CST; 39s ago
Docs: https://docs.docker.com
Main PID: 1078 (dockerd)
Memory: 112.1M
CGroup: /system.slice/docker.service
└─1078 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
7月 19 11:59:54 docker dockerd[1078]: time="2021-07-19T11:59:54.982690174+08:00" level=info msg="pickfirstBalancer: HandleSubC...le=grpc
7月 19 11:59:54 docker dockerd[1078]: time="2021-07-19T11:59:54.982732061+08:00" level=info msg="pickfirstBalancer: HandleSubC...le=grpc
7月 19 11:59:55 docker dockerd[1078]: time="2021-07-19T11:59:55.020157431+08:00" level=info msg="Graph migration to content-ad...econds"
7月 19 11:59:55 docker dockerd[1078]: time="2021-07-19T11:59:55.020953607+08:00" level=info msg="Loading containers: start."
7月 19 11:59:55 docker dockerd[1078]: time="2021-07-19T11:59:55.293273747+08:00" level=info msg="Default bridge (docker0) is a...ddress"
7月 19 11:59:55 docker dockerd[1078]: time="2021-07-19T11:59:55.314828185+08:00" level=info msg="Loading containers: done."
7月 19 11:59:55 docker dockerd[1078]: time="2021-07-19T11:59:55.635367660+08:00" level=info msg="Docker daemon" commit=481bc77...18.09.6
7月 19 11:59:55 docker dockerd[1078]: time="2021-07-19T11:59:55.635500710+08:00" level=info msg="Daemon has completed initialization"
7月 19 11:59:55 docker dockerd[1078]: time="2021-07-19T11:59:55.689370706+08:00" level=info msg="API listen on /var/run/docker.sock"
7月 19 11:59:55 docker systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.
******(1)查看Docker的版本
[root@docker ~]# uname -r #查看自己系统内核版本
3.10.0-693.el7.x86_64
[root@docker ~]# docker version #查看Docker基本信息
Client:
Version: 18.09.6
API version: 1.39
Go version: go1.10.8
Git commit: 481bc77156
Built: Sat May 4 02:34:58 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.6
API version: 1.39 (minimum version 1.12)
Go version: go1.10.8
Git commit: 481bc77
Built: Sat May 4 02:02:43 2019
OS/Arch: linux/amd64
Experimental: false
[root@docker ~]# docker info #查看Docker基本信息
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 18.09.6
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: bb71b10fd8f58240ca47fbb579b9d1028eea7c84
runc version: 2b18fe1d885ee5083ef9f0838fee39b62d653e30
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-693.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 976.3MiB
Name: docker
ID: C2X2:P4NY:JF4I:IMPN:6WQW:FEYT:CZGL:F2NN:QKKC:UFOY:6VBN:PAVE
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://w4uieobw.mirror.aliyuncs.com/
Live Restore Enabled: false
Product License: Community Engine
[root@docker ~]# cd /etc/docker/
[root@docker docker]# ll
总用量 8
-rw-r--r-- 1 root root 68 7月 17 14:31 daemon.json #这个文件用来设置docker参数,没有的话可以自行创建,设置完后要重启Docker
-rw------- 1 root root 244 7月 17 14:28 key.json
三、拉取镜像,创建容器
******(1)拉取镜像
[root@docker ~]# docker pull nginx #从镜像库拉取httpd镜像,需要联网,不加版本号TAG默认就是下来latest版本
。。。。。。
完毕!
[root@docker ~]# docker images #查看所有本地镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 4cdc5dd7eaad 12 days ago 133MB
******(2)创建容器
[root@docker ~]# docker run -d -P nginx #创建容器,-d表示放到后台运行,-P表示使用随机端口进行映射
WARNING: IPv4 forwarding is disabled. Networking will not work.
1137042596d20aebbb9aace778fc280e81b626da3b97c92000bbd456688d49ad
[root@docker ~]# docker ps #查看正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1137042596d2 nginx "/docker-entrypoint.…" 8 seconds ago Up 7 seconds 0.0.0.0:32768->80/tcp cocky_heisenberg #可以看到是本地的32768端口映射到了容器的80端口
[root@docker ~]# vim /etc/sysctl.conf #开启路由转发
net.ipv4.ip_forward = 1
#保存退出
[root@docker ~]# sysctl -p #使配置生效
net.ipv4.ip_forward = 1
(3)使用浏览器进行访问
成功访问
******(4)再次开启一台nginx容器
[root@docker ~]# docker run -d --name web -p 80:80 nginx #--name指定名称,使用-p来指定端口映射
c850556b1a54c7fc8720bee41af0fda66a42d4e056d7d37391bbad44fe63c0fb
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c850556b1a54 nginx "/docker-entrypoint.…" 6 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp web #可以看到name为web,端口映射为80
1137042596d2 nginx "/docker-entrypoint.…" 12 minutes ago Up 12 minutes 0.0.0.0:32768->80/tcp cocky_heisenberg
(5)进行测试
******(6)开启容器在前台运行
[root@docker ~]# docker run -it --name web3 -P nginx /bin/bash #-i保持连接,-t创建为终端,在末尾加环境如/bin/bash
root@3217e10286eb:/# #因为加了环境/bin/bash所以进入了此环境
#复制一个终端,查看此时web3映射的端口号
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3217e10286eb nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:32770->80/tcp web3 #可以看到是32770
18563a3438e5 nginx "/docker-entrypoint.…" 2 minutes ago Exited (0) About a minute ago web2
c850556b1a54 nginx "/docker-entrypoint.…" 7 minutes ago Up 7 minutes 0.0.0.0:80->80/tcp web
1137042596d2 nginx "/docker-entrypoint.…" 19 minutes ago Up 18 minutes 0.0.0.0:32768->80/tcp cocky_heisenberg
使用浏览器进行访问,无法正常访问
root@3217e10286eb:~# nginx
2021/07/19 04:59:50 [notice] 7#7: using the "epoll" event method
2021/07/19 04:59:50 [notice] 7#7: nginx/1.21.1
2021/07/19 04:59:50 [notice] 7#7: built by gcc 8.3.0 (Debian 8.3.0-6)
2021/07/19 04:59:50 [notice] 7#7: OS: Linux 3.10.0-693.el7.x86_64
2021/07/19 04:59:50 [notice] 7#7: getrlimit(RLIMIT_NOFILE): 1048576:1048576
root@dfc7f004dfbb:/# 2021/07/19 04:59:50 [notice] 8#8: start worker processes
2021/07/19 04:59:50 [notice] 8#8: start worker process 9
再次进行访问,可以正常访问
^C #中断
root@dfc7f004dfbb:/# exit #退出
exit
******(7)删除容器
[root@docker ~]# docker ps -a #先查看所有容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dfc7f004dfbb nginx "/docker-entrypoint.…" 5 minutes ago Exited (130) 31 seconds ago web3
18563a3438e5 nginx "/docker-entrypoint.…" 11 minutes ago Exited (0) 10 minutes ago web2
c850556b1a54 nginx "/docker-entrypoint.…" 15 minutes ago Up 15 minutes 0.0.0.0:80->80/tcp web
1137042596d2 nginx "/docker-entrypoint.…" 27 minutes ago Up 27 minutes 0.0.0.0:32768->80/tcp cocky_heisenberg
[root@docker ~]# docker rm dfc7f004dfbb #删除时要注意容器是关闭状态,rm是删除后面输入id号,可以加-f强制删除
dfc7f004dfbb
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
18563a3438e5 nginx "/docker-entrypoint.…" 11 minutes ago Exited (0) 10 minutes ago web2
c850556b1a54 nginx "/docker-entrypoint.…" 16 minutes ago Up 16 minutes 0.0.0.0:80->80/tcp web
1137042596d2 nginx "/docker-entrypoint.…" 27 minutes ago Up 27 minutes 0.0.0.0:32768->80/tcp cocky_heisenberg
[root@docker ~]# docker rm web2 #输入后面的name也可以
web2
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c850556b1a54 nginx "/docker-entrypoint.…" 17 minutes ago Up 17 minutes 0.0.0.0:80->80/tcp web
1137042596d2 nginx "/docker-entrypoint.…" 29 minutes ago Up 29 minutes 0.0.0.0:32768->80/tcp cocky_heisenberg
[root@docker ~]# docker stop c850556b1a54 #关闭容器
c850556b1a54
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c850556b1a54 nginx "/docker-entrypoint.…" 17 minutes ago Exited (0) 1 second ago web
1137042596d2 nginx "/docker-entrypoint.…" 29 minutes ago Up 29 minutes 0.0.0.0:32768->80/tcp cocky_heisenberg
[root@docker ~]# docker stop $(docker ps -qa ) #利用$()括起来一次性关闭
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c850556b1a54 nginx "/docker-entrypoint.…" 18 minutes ago Exited (0) 17 seconds ago web
1137042596d2 nginx "/docker-entrypoint.…" 30 minutes ago Exited (0) 2 seconds ago cocky_heisenberg
[root@docker ~]# docker rm $(docker ps -qa) #当然也可以用来删除
[root@docker ~]# docker ps -a #查看所有容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
四、容器资源限制
- 一个docker host上会运行若干容器,每个容器都需要CPU、内存和 IO 磁盘读写资源。
- 对于 KVM,VMware等虚拟化技术,用户可以控制分配多少 CPU、内存资源给每个虚拟机。对于容器,Docker 也提供了类似的机制避免某个容器因占用太多资源而影响其他容器乃至整个 host 的性能。
(1)内存限制
#选项说明:
-m:允许分配的内存大小
--memory-swap:允许分配的内存和swap的总大小
--memory-swapiness:控制内存与swap置换的比例
--vm:设置内存工作线程数
--vm-byptes:设置单个内存工作线程使用的内存大小
#如果启用了--memory-swap参数,相当于使用了swap,则实际内存限制并不生效,要想限制生效,可以不启动该参数,且将--memory-swappiness置为0
测试:
[root@docker ~]# docker run -d -m 200M --memory-swappiness 0 nginx --vm 1 --vm-bytes 180M #设置内存限制为200M,不适应swap交换内存,--vm 1开启一个进程,--vm-bytes 180M 设置每个进程的大小为180M
9f9e0fe86d72393ee9ffa691798d3ba2f49a9bc9dbf4c849dba0af3c497f4ef9
[root@docker ~]# docker ps -a #查看所有容器,发现成功启动
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f9e0fe86d72 nginx "/docker-entrypoint.…" 6 seconds ago Exited (127) 5 seconds ago musing_hellman
[root@docker ~]# docker stop 9f9e0fe86d72
9f9e0fe86d72
[root@docker ~]# docker run -d -m 200M --memory-swappiness 0 nginx --vm 1 --vm-bytes 230M #再次开启一个容器,这次进程大小为230M
19c01aaa0ba18b4240eacd582227ca7ae4ae1da8b558190c0493983cbc33fcff
[root@docker ~]# docker ps -a #查看所有容器,发现容器直接就被停止了,这是因为内存溢出,Docker强制关闭了
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19c01aaa0ba1 nginx "/docker-entrypoint.…" 4 seconds ago Exited (127) 3 seconds ago pedantic_mendel
9f9e0fe86d72 nginx "/docker-entrypoint.…" 25 seconds ago Exited (127) 24 seconds ago musing_hellman
(2)CPU限制
-
默认情况下,所有容器可以平等的使用宿主机cpu资源且没有限制。docker可以通过-c或–cpu-shares设置容器使用的cpu的权重。如果不指定,默认为1024。
-
与内存限额不同,通过 -c 设置的 cpu share 并不是 CPU 资源的绝对数量,而是一个相对的权重值。某个容器最终能分配到的 CPU 资源取决于它的 cpu share 占所有容器 cpu share 总和的比例。换句话说:通过cpu share可以设置容器使用CPU的优先级。
#例子
docker run --name A -c 1024 nginx
docker run --name B -c 512 nginx
A的cpu share 1024,是 B 的两倍。当两个容器都需要 CPU 资源时,A可以得到的 CPU 是B的两倍。
需要特别注意的是,这种按权重分配CPU只会发生在CPU 资源紧张的情况下。如果A 处于空闲状态,这时,为了充分利用CPU资源,B 也可以分配到全部可用的 CPU。加--cpu可以指定cpu的核数
(3)磁盘IO限制
-
Block IO 是另一种可以限制容器使用的资源。Block IO 指的是磁盘的读写,docker 可通过设置权重、限制 bps 和 iops 的方式控制容器读写磁盘的带宽,下面分别讨论。
-
需要说明的是,目前Block IO限额只对direct IO(不使用文件缓存)有效
限制bps和iops的参数说明:
--device-read-bps,限制读某个设备的 bps。
--device-write-bps,限制写某个设备的 bps。
--device-read-iops,限制读某个设备的 iops。
--device-write-iops,限制写某个设备的 iops。
bps是byte per second,每秒读写的数据量
iops是io per second,每秒io的次数
#示例:
# 创建一个容器,限制写的bps为30M
• docker run -it --device-write-bps /dev/sda:30MB ubuntu
# 容器中,执行如下操作查看效果,然后可以通过取消限制,来查看对比效果:
• time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct
五、镜像简单管理
[root@docker ~]# docker images #查看所有镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 4cdc5dd7eaad 12 days ago 133MB
(1)镜像命名规范
- 无论我们对镜像做何种操作,首先它得有个名字。我们在前面使用docker run来运行容器的时候,就需要传递一个镜像名称,容器基于该镜像来运行。
一个完整的镜像名称由两部分组成:
<image name> = <repository>:[tag] #也就是镜像名称等于镜像名+版本名
其中repository包含如下内容:
[Docker Registry地址/][项目目录/]<名称>
所以一个完整的镜像命名如下:
[Docker Registry地址/][项目目录/]<名称>:[标签]
- 当没指明镜像tag时,默认为latest,但latest没有任何特殊含义,在docker hub上很多repository将latest作为最新稳定版本的别名,但这只是一种约定,不是强制规定,一个repository可以有多个tag,而多个tag也可能对应同一个镜像
(2)镜像的基本操作
******拉取镜像
docker pull 镜像名称 #默认是从docker的镜像仓库中下载
******从指定位置拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.1.3
#指定仓库位置 registry.cn-hangzhou.aliyuncs.com
#路径:google_containers
#镜像名:coredns:1.1.3
******查看镜像
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 4cdc5dd7eaad 12 days ago 133MB
[root@docker ~]# docker images ls #可以指定名称查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@docker ~]# docker images nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 4cdc5dd7eaad 12 days ago 133MB
******获取镜像详细信息
[root@docker ~]# docker inspect nginx:latest #镜像名需要输入镜像名称和版本名称
******修改镜像名称、标签
[root@docker ~]# docker tag nginx:latest nginx2:aaa #前面是指定的镜像,后面是修改的名称和版本,这个修改是创建
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 4cdc5dd7eaad 12 days ago 133MB
nginx2 aaa 4cdc5dd7eaad 12 days ago 133MB
******删除镜像,如果镜像有容器生成需要先删除容器再删除镜像
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx2 aaa 4cdc5dd7eaad 12 days ago 133MB
nginx latest 4cdc5dd7eaad 12 days ago 133MB
[root@docker ~]# docker rmi nginx2:aaa #后面需要指定名称和标签,因为这里都是一个镜像,只不过名称和版本不同,但是id号是一样的,删除id号会把当前所有镜像都删除
Untagged: nginx2:aaa
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 4cdc5dd7eaad 12 days ago 133MB
******删除无标签镜像(即为none)
docker rmi $(docker images -q --filter "dangling=true")
导出和载入镜像
******将本地镜像导出
[root@docker ~]# docker save -o nginx nginx:latest #save -o保存到当前目录下,保存为nginx,镜像为nginx:latest
[root@docker ~]# ll
总用量 134228
-rw-------. 1 root root 1264 1月 12 2021 anaconda-ks.cfg
drwxr-xr-x 3 root root 4096 7月 17 14:26 docker
-rw------- 1 root root 137441280 7月 19 14:54 nginx
******将本地文件导入镜像
[root@docker ~]# docker rmi nginx:latest #删除原来的镜像
Untagged: nginx:latest
Deleted: sha256:4cdc5dd7eaadff5080649e8d0014f2f8d36d4ddf2eff2fdf577dd13da85c5d2f
Deleted: sha256:63d268dd303e176ba45c810247966ff8d1cb9a5bce4a404584087ec01c63de15
Deleted: sha256:b27eb5bbca70862681631b492735bac31d3c1c558c774aca9c0e36f1b50ba915
Deleted: sha256:435c6dad68b58885ad437e5f35f53e071213134eb9e4932b445eac7b39170700
Deleted: sha256:bdf28aff423adfe7c6cb938eced2f19a32efa9fa3922a3c5ddce584b139dc864
Deleted: sha256:2c78bcd3187437a7a5d9d8dbf555b3574ba7d143c1852860f9df0a46d5df056a
Deleted: sha256:764055ebc9a7a290b64d17cf9ea550f1099c202d83795aa967428ebdf335c9f7
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@docker ~]# docker load --input nginx #将本地nginx镜像文件导入
764055ebc9a7: Loading layer [==================================================>] 72.53MB/72.53MB
ace9ed9bcfaf: Loading layer [==================================================>] 64.86MB/64.86MB
48b4a40de359: Loading layer [==================================================>] 3.072kB/3.072kB
c553c6ba5f13: Loading layer [==================================================>] 4.096kB/4.096kB
d97733c0a3b6: Loading layer [==================================================>] 3.584kB/3.584kB
9d1af766c818: Loading layer [==================================================>] 7.168kB/7.168kB
Loaded image: nginx:latest
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 4cdc5dd7eaad 12 days ago 133MB
******通过docker commit提交一个新镜像
[root@docker ~]# docker run -d -P nginx #创建新容器
ebedef7466a82d8a87cbcf60464027cde5df40202b6f46164d3c1003828a2ad1
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ebedef7466a8 nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:32780->80/tcp sad_ritchie
[root@docker ~]# docker commit -m "newnginx" -a "rzy" -p ebedef7466a8 test #利用新创建的容器创建test镜像
sha256:c47971dc128ac9186ebab7c2f561bcb0c26e90e982e9720ac87c1d809556e675
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test latest c47971dc128a 6 seconds ago 133MB
nginx latest 4cdc5dd7eaad 12 days ago 133MB
#commit选项说明,-a和-m可以忽略不用这两个选项
-a:指定作者
-m:相关说明信息
-p:提交时暂停容器运行
以上是关于Docker容器的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Rider 调试使用 docker 容器和 docker-compose 构建的 .net 核心应用程序。容器退出代码 139
vscode 远程连接 docker 容器进行 C++ 代码调试实践