Python3 - Docker基础详解(三)
文章目录
1. Dockerfile的基本用法
mkdir mynginxcd mynginxvim Dockerfile
FROM nginxRUN echo 'hello world !!!!
' > /usr/share/nginx/html/index.html
# 构建镜像docker build -t nginx:v3 .# 运行镜像docker run --name webserv3 -d -p 8083:80 nginx:v3# 打包镜像docker save nginx:v3 | gzip > nginx.v3.tar.gz# 加载镜像docker load -i nginx.v3.tar.gz # 查看历史docker history nginx:v3
docker diff webserv # 查看容器修改情况docker commit --author 'harry.com' --message "修改了默认首页" 5b4afafecc29 nginx:v2docker history nginx:v2 # 查看历史记录docker rm -f $(docker ps -aq) # 删除所有
2. Docker私有仓库
2.1 Docker Hub
目前 Docker 官方维护了一个公共仓库Docker Hub
,大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。如果你觉得拉取 Docker Hub 的镜像比较慢的话,我们可以配置一个镜像加速器:http://docker-cn.com/(目前好像都会跳转到官方网站),当然国内大部分云厂商都提供了相应的加速器,简单配置即可。
2.2 注册
你可以在 https://cloud.docker.com 免费注册一个 Docker 账号。
2.3 登录
通过执行docker login
命令交互式的输入用户名及密码来完成在命令行界面登录 Docker Hub。
2.4 注销
你可以通过docker logout
退出登录。 拉取镜像
2.5 拉取镜像
你可以通过docker search
命令来查找官方仓库中的镜像,并利用docker pull
命令来将它下载到本地。
例如以 centos 为关键词进行搜索:
harry@bogon dockerfile % docker search centosNAME DESCRIPTION STARS OFFICIAL AUTOMATEDcentos The official build of CentOS. 7093 [OK]centos/systemd systemd enabled base container. 107[OK]centos/mysql-57-centos7 MySQL 5.7 SQL database server 92 centos/postgresql-96-centos7 PostgreSQL is an advanced Object-Relational … 45 centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or bui… 44 centos/python-35-centos7 Platform for building and running Python 3.5… 39 centos/php-56-centos7 Platform for building and running PHP 5.6 ap… 34 centos/mysql-56-centos7 MySQL 5.6 SQL database server 22 centos/postgresql-10-centos7 PostgreSQL is an advanced Object-Relational … 19 ....
可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、收藏数(表示该镜像的受关注程度)、是否官方创建、是否自动创建。
官方的镜像说明是官方项目组创建和维护的,automated
资源允许用户验证镜像的来源和内容。
根据是否是官方提供,可将镜像资源分为两类。
- 一种是类似 centos 这样的镜像,被称为基础镜像或根镜像。这些基础镜像由 Docker 公司创建、验证、支持、提供。这样的镜像往往使用单个单词作为名字。
- 还有一种类型,比如 tianon/centos 镜像,它是由 Docker 的用户创建并维护的,往往带有用户名称前缀。可以通过前缀
username/
来指定使用某个用户提供的镜像,比如 tianon 用户。
另外,在查找的时候通过--filter=stars=N
参数可以指定仅显示收藏数量为 N 以上的镜像。下载官方 centos 镜像到本地。
# 登录docker login# 推送到仓库# 先重命名docker tag nginx:v3 harry88995/test-nginx:v3# push 到仓库docker push harry88995/test-nginx:v3# 配置镜像加速器https://registry.docker-cn.com
2.6 私有仓库
有时候使用 Docker Hub 这样的公共仓库可能不方便,用户可以创建一个本地仓库供私人使用。
docker-registry
是官方提供的工具,可以用于构建私有的镜像仓库。本文内容基于 docker-registry v2.x 版本。你可以通过获取官方 registry 镜像来运行。
# 配置私有仓库docker run --name myregistry -d -p 5001:5000 registry:2.6.2# 修改名字docker tag nginx:v3 127.0.0.1:5001/nginx:v3# 提交到私有仓库docker push 127.0.0.1:5001/nginx:v3 # 浏览器看下http://127.0.0.1:5001/v2/_catalog {"repositories":["nginx"]}# 删除本地镜像harry@bogon dockerfile % docker rmi 127.0.0.1:5001/nginx:v3Untagged: 127.0.0.1:5001/nginx:v3Untagged: 127.0.0.1:5001/nginx@sha256:42df2f3658c36b78c2dff700d2f3eb8a# 如果想让内网的人都能访问呢?ifconfigen0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500options=6463<RXCSUM,TXCSUM,TSO4,TSO6,CHANNEL_IO,PARTIAL_CSUM,ZEROINVERT_CSUM>ether a4:83:e7:ab:a9:33 inet6 fe80::1835:86d0:facb:9900%en0 prefixlen 64 secured scopeid 0x6 inet 192.168.0.4 netmask 0xffffff00 broadcast 192.168.0.255nd6 options=201<PERFORMNUD,DAD>media: autoselectstatus: active192.168.0.4 为局域网ip# 重新打包成 192.168.0.4 即可# 重命名harry@bogon dockerfile % docker tag nginx:v3 192.168.0.4:5001/nginx:v3harry@bogon dockerfile % docker push 192.168.0.4:5001/nginx:v3The push refers to repository [192.168.0.4:5001/nginx]Get "https://192.168.0.4:5001/v2/": http: server gave HTTP response to HTTPS client# 提示https, 设置解除https# 添加{ "registry-mirrors": [ "https://registry.docker-cn.com" ],"insecure-registries":["192.168.0.4:5001"]}# 先删除一下myregistrydocker rm -f myregistry# 挂载一下docker run --name myregistry -d -p 5001:5000 -v /Users/harry/PythonStudy/k8s-Stydy/dockerfile:/var/lib/registry registry:2.6.2# 重新挂载后发现恢复
2.7 在私有仓库上传、搜索、下载镜像
创建好私有仓库之后,就可以使用docker tag
来标记一个镜像,然后推送它到仓库。例如私有仓库地址为 127.0.0.1:5001。先在本机查看已有的镜像。
harry@bogon dockerfile % docker images REPOSITORY TAG IMAGE IDCREATED SIZEnginx v4 e3d89c83facd 12 hours ago 141MB192.168.0.4:5001/nginx v2 ce095e23499e 17 hours ago 141MBnginx v2 ce095e23499e 17 hours ago 141MBmysql 5.7 f26e21ddd20d 12 days ago 450MB
使用docker tag
将 ubuntu:latest 这个镜像标记为 127.0.0.1:5001/ubuntu:latest。 格式为 docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
2.8 注意事项
如果你不想使用 127.0.0.1:5001 作为仓库地址,比如想让本网段的其他主机也能把镜像推送到私有仓库。你就得把例如 192.168.199.100:5001 这样的内网地址作为私有仓库地址,这时你会发现无法成功推送镜像。
这是因为 Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制。
3. 数据共享与持久化
在容器中管理数据主要有两种方式:
- 数据卷(Data Volumes)
- 挂载主机目录 (Bind mounts)
3.1 数据卷
数据卷
是一个可供一个或多个容器使用的特殊目录,它绕过UFS
,可以提供很多有用的特性:
- 数据卷 可以在容器之间共享和重用
- 对 数据卷 的修改会立马生效
- 对 数据卷 的更新,不会影响镜像
- 数据卷 默认会一直存在,即使容器被删除
注意:数据卷 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的 数据卷。
选择 -v 还是 -–mount 参数: Docker 新用户应该选择--mount
参数,经验丰富的 Docker 使用者对-v
或者 --volume
已经很熟悉了,但是推荐使用--mount
参数。
创建一个数据卷:
# 运行一个 mysql5.7, 端口3309, 忽略密码docker run -d --name mysql1 -p 3309:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:5.7 # 查看 volume 数据卷harry@bogon dockerfile % docker volume lsDRIVER VOLUME NAMElocal 9bdbee9aa6ee681321cc63f459333e08589b295e118e99ea9cc8eabe3f9bf52dlocal a94ce591b3b34b7b5cf07d620bcbc43c31797fc85ccb2f390ca5efdab31ec979local ae99f461620c947882004c6a0f0f79a7fc29bae62385c3984649e9511e29f2a7local da2f5c25f0e9eb9de5ae004fe55a86da4ea18d7ae92e9cbc0499b2c65ca0adf1local vsCodeServerVolume-pear-admin-flask1-competent_poitras
查看mysql的详细信息:
# mysql详细详细docker inspect mysql1# 数据卷列表harry@bogon dockerfile % docker volume ls DRIVER VOLUME NAMElocal 9bdbee9aa6ee681321cc63f459333e08589b295e118e99ea9cc8eabe3f9bf52dlocal a94ce591b3b34b7b5cf07d620bcbc43c31797fc85ccb2f390ca5efdab31ec979local ae99f461620c947882004c6a0f0f79a7fc29bae62385c3984649e9511e29f2a7local da2f5c25f0e9eb9de5ae004fe55a86da4ea18d7ae92e9cbc0499b2c65ca0adf1local vsCodeServerVolume-pear-admin-flask1-competent_poitras# 查看mysql对应的数据卷harry@bogon dockerfile % docker volume inspect 9bdbee9aa6ee681321cc63f459333e08589b295e118e99ea9cc8eabe3f9bf52d[ { "CreatedAt": "2022-04-10T13:26:06Z", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/9bdbee9aa6ee681321cc63f459333e08589b295e118e99ea9cc8eabe3f9bf52d/_data", "Name": "9bdbee9aa6ee681321cc63f459333e08589b295e118e99ea9cc8eabe3f9bf52d", "Options": null, "Scope": "local" }]# 进入mysqlharry@bogon dockerfile % docker exec -it mysql1 /bin/bashroot@6d45ac7ab3b4:/# mysql -urootWelcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 2Server version: 5.7.37 MySQL Community Server (GPL)Copyright (c) 2000, 2022, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> create database docker;Query OK, 1 row affected (0.00 sec)mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || docker || mysql|| performance_schema || sys |+--------------------+5 rows in set (0.00 sec)mysql> exitBye# 验证数据卷# 先删掉mysql1harry@bogon dockerfile % docker rm -f mysql1# 再创建mysql5.7, 命名mysql2docker run -d --name mysql2 -p 3309:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:5.7# 进入查看下, 发现没有docker, 每次创建mysql都会重新创建volumeharry@bogon dockerfile % docker exec -it mysql2 /bin/bashroot@dc729a913665:/# mysql -urootWelcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 2Server version: 5.7.37 MySQL Community Server (GPL)Copyright (c) 2000, 2022, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases -> ;+--------------------+| Database |+--------------------+| information_schema || mysql|| performance_schema || sys |+--------------------+4 rows in set (0.00 sec)mysql> # 删除mysql2docker rm -f mysql2# 重新创建mysql2, 使用-v挂载数据卷 docker run -d --name mysql2 -v mysql:/var/lib/mysql -p 3309:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:5.7# 查看数据卷, 多了个mysqlharry@bogon dockerfile % docker volume lsDRIVER VOLUME NAMElocal 9bdbee9aa6ee681321cc63f459333e08589b295e118e99ea9cc8eabe3f9bf52dlocal a94ce591b3b34b7b5cf07d620bcbc43c31797fc85ccb2f390ca5efdab31ec979local ae99f461620c947882004c6a0f0f79a7fc29bae62385c3984649e9511e29f2a7local b5fba44ed7e4b3b04ab8326bd3b803dcb131215e11e85607a129084b6434fbe5local da2f5c25f0e9eb9de5ae004fe55a86da4ea18d7ae92e9cbc0499b2c65ca0adf1local mysqllocal vsCodeServerVolume-pear-admin-flask1-competent_poitras# 查看数据卷harry@bogon dockerfile % docker inspect volume mysql[ { "CreatedAt": "2022-04-10T13:48:00Z", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/mysql/_data", "Name": "mysql", "Options": null, "Scope": "local" }]# 进入mysql容器, 重新创建docker数据库harry@bogon dockerfile % docker exec -it mysql2 /bin/bashmysql> create database docker;Query OK, 1 row affected (0.00 sec)mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || docker || mysql|| performance_schema || sys |+--------------------+5 rows in set (0.00 sec)mysql> exitBye# 删除mysql2harry@bogon dockerfile % docker rm -f mysql2mysql2# 查看数据卷, mysql依然存在harry@bogon dockerfile % docker volume lsDRIVER VOLUME NAMElocal 9bdbee9aa6ee681321cc63f459333e08589b295e118e99ea9cc8eabe3f9bf52dlocal a94ce591b3b34b7b5cf07d620bcbc43c31797fc85ccb2f390ca5efdab31ec979local ae99f461620c947882004c6a0f0f79a7fc29bae62385c3984649e9511e29f2a7local b5fba44ed7e4b3b04ab8326bd3b803dcb131215e11e85607a129084b6434fbe5local da2f5c25f0e9eb9de5ae004fe55a86da4ea18d7ae92e9cbc0499b2c65ca0adf1local mysqllocal vsCodeServerVolume-pear-admin-flask1-competent_poitras# 创建mysql100, 进入mysql100, 发现mysql的表存在挂载的docker数据库, 说明容器的是否存在不影响已创建的数据卷docker run -d --name mysql100 -v mysql:/var/lib/mysql -p 3309:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:5.7 # 如何删除数据卷docker stop mysql100harry@bogon dockerfile % docker volume rm mysql mysql# 删除所有数据卷, 注意慎重, 确定没使用到docker volume prune
3.2 挂载主机目录
我们来写个ngin的Dockerfile, 挂载数据卷
FROM nginx#RUN echo 'hello world !!!!
' > /usr/share/nginx/html/index.htmlWORKDIR /usr.share/nginx/htmlCOPY index.html index.html
其中index.html
<h1>hello, docker!!!</h1>
# 构建一下harry@bogon dockerfile % docker build -t nginx:v4 . [+] Building 0.2s (8/8) FINISHED=> [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 190B 0.0s => [internal] load .dockerignore0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/nginx:latest 0.0s => CACHED [1/3] FROM docker.io/library/nginx 0.0s => [2/3] WORKDIR /usr.share/nginx/html 0.0s => [internal] load build context0.0s => => transferring context: 67B 0.0s => [3/3] COPY index.html index.html 0.0s => exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:091dd1ac7ba38cb7c180a8ae22d8e5ae92730bba5569090e477519f6afc06d2a => => naming to docker.io/library/nginx:v4
# 查看一下镜像harry@bogon dockerfile % docker imagesREPOSITORY TAG IMAGE IDCREATED SIZEnginx v4 091dd1ac7ba3 5 seconds ago 141MB192.168.0.4:5001/nginx v2 ce095e23499e 5 hours ago 141MB# 运行harry@bogon dockerfile % docker run -d --name mynginx -p 8084:80 nginx:v4ef431226664eca254c17233ec48c5b1c98dcbd34d958d1a693fe2beb33090b44harry@bogon dockerfile % docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESef431226664e nginx:v4 "/docker-entrypoint.…" 3 seconds ago Up 3 seconds 0.0.0.0:8084->80/tcp mynginxa7f1228cc3ae registry:2.6.2 "/entrypoint.sh /etc…" 44 minutes ago Up 44 minutes 0.0.0.0:5001->5000/tcp myregistry
挂载目录
# 先删除一下nginxdocker rm -f mynginx# 重新挂载运行harry@bogon dockerfile % docker run -d --name mynginx -v $(pwd):/usr/share/nginx/html -p 8084:80 nginx:v4# 发现 /usr/share/nginx/html 数据同步了, 修改本地和容器都能同步生效
4. Docker 的网络模式
harry@bogon dockerfile % docker network lsNETWORK ID NAME DRIVER SCOPE29876ce47f6a bridge bridge local8df8a313b670 host host local0f61296c066b none null local
4.1 Bridge模式
当Docker
进程启动时,会在主机上创建一个名为docker0
的虚拟网桥,此主机上启动的Docker
容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。从docker0
子网中分配一个 IP 给容器使用,并设置 docker0 的 IP 地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair
设备,Docker 将 veth pair 设备的一端放在新创建的容器中,并命名为eth0
(容器的网卡),另一端放在主机中,以vethxxx
这样类似的名字命名,并将这个网络设备加入到 docker0 网桥中。可以通过brctl show
命令查看。
bridge
模式是 docker 的默认网络模式,不写–net
参数,就是bridge
模式。使用docker run -p
时,docker 实际是在iptables
做了DNAT
规则,实现端口转发功能。可以使用iptables -t nat -vnL
查看。bridge
模式如下图所示:
验证一下:
# 启动docker1docker run --name test1 -d busybox /bin/sh -c 'while true; do echo hello; sleep 10; done'# 启动docker2docker run --name test2 -d busybox /bin/sh -c 'while true; do echo hello; sleep 10; done'
# test1 ip:172.17.0.4harry@bogon dockerfile % docker exec -it test1 /bin/sh/ # ifconfigeth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:04 inet addr:172.17.0.4 Bcast:172.17.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:10 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:796 (796.0 B) TX bytes:0 (0.0 B) # test2 ip:172.17.0.5 harry@bogon dockerfile % docker exec -it test2 /bin/sh/ # ifconfigeth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:05 inet addr:172.17.0.5 Bcast:172.17.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:9 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:726 (726.0 B) TX bytes:0 (0.0 B) # 在test2中ping test1 的ip/ # ping 172.17.0.4harry@bogon dockerfile % docker exec -it test2 /bin/shPING 172.17.0.4 (172.17.0.4): 56 data bytes64 bytes from 172.17.0.4: seq=0 ttl=64 time=0.125 ms64 bytes from 172.17.0.4: seq=1 ttl=64 time=0.128 ms64 bytes from 172.17.0.4: seq=2 ttl=64 time=0.207 ms# 在test1中ping test2 的ipharry@bogon dockerfile % docker exec -it test1 /bin/sh/ # ping 172.17.0.5 PING 172.17.0.5 (172.17.0.5): 56 data bytes64 bytes from 172.17.0.5: seq=0 ttl=64 time=0.074 ms64 bytes from 172.17.0.5: seq=1 ttl=64 time=0.094 ms64 bytes from 172.17.0.5: seq=2 ttl=64 time=0.129 ms64 bytes from 172.17.0.5: seq=3 ttl=64 time=0.131 ms# 删除尝试关联docker rm -f test2docker run --name test2 --link test1 -d busybox /bin/sh -c 'while true; do echo hello; sleep 10; done'--link 只能在test2里访问test1# 创建一个网络harry@bogon dockerfile % docker network create -d bridge demo02cae447fa347674a134ab2919860507f5c172912ad385a0e9ce60a426cc3c92harry@bogon dockerfile % docker network lsNETWORK ID NAME DRIVER SCOPE29876ce47f6a bridge bridge local02cae447fa34 demo bridge local8df8a313b670 host host local0f61296c066b none null local# 创建test3harry@bogon dockerfile % docker run --name test3 --network demo -d busybox /bin/sh -c 'while true; do echo hello; sleep 10; done' ee5c4b7e94691cb5490023533269fd20e011cc64c1653b778559d9cbbf1f1c18# 创建test4harry@bogon dockerfile % docker run --name test4 --network demo -d busybox /bin/sh -c 'while true; do echo hello; sleep 10; done'a53e5e1d19b82cb7b4b49be3c4f4d2b402e7996f1acfd538ed0ac513a461c5e9# 发现可以互相ping通# 可以看到demo网络有test3, test4harry@bogon dockerfile % docker network create -d bridge demo "Containers": { "a53e5e1d19b82cb7b4b49be3c4f4d2b402e7996f1acfd538ed0ac513a461c5e9": { "Name": "test4", "EndpointID": "0e215049eebedbce7efb4cf97a2ad3f2c141c55b41a7799006f0b0775d0881e4", "MacAddress": "02:42:ac:12:00:03", "IPv4Address": "172.18.0.3/16", "IPv6Address": "" }, "ee5c4b7e94691cb5490023533269fd20e011cc64c1653b778559d9cbbf1f1c18": { "Name": "test3", "EndpointID": "8bbec0110e1a031c7a257464af2b36446279e1617257680f6935a0521c9f399a", "MacAddress": "02:42:ac:12:00:02", "IPv4Address": "172.18.0.2/16", "IPv6Address": "" } },
这样,test1 容器和 test2 容器建立了互联关系。
如果你有多个容器之间需要互相连接,推荐使用Docker Compose
。
4.2 Host 模式
如果启动容器的时候使用host
模式,那么这个容器将不会获得一个独立的Network Namespace
,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。 Host模式如下图所示:
验证一下:
# 创建test5_hostharry@bogon dockerfile % docker run --name test5_host --network demo -d busybox /bin/sh -c 'while true; do echo hello; sleep 10; done'84bae4ee839d938462b3027acc90e01e066b3924c8367b0957d5863b5b79ee23harry@bogon dockerfile % docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES84bae4ee839d busybox "/bin/sh -c 'while t…" 38 seconds ago Up 37 secondstest5_hosta53e5e1d19b8 busybox "/bin/sh -c 'while t…" 4 minutes ago Up 4 minutes test4ee5c4b7e9469 busybox "/bin/sh -c 'while t…" 5 minutes ago Up 5 minutes test35b98e1c9b29f busybox "/bin/sh -c 'while t…" 9 minutes ago Up 9 minutes test26a5ebeea20fa busybox "/bin/sh -c 'while t…" 20 minutes ago Up 20 minutestest192b43f6d4717 nginx:v4 "/docker-entrypoint.…" 12 hours ago Up 12 hours 0.0.0.0:8084->80/tcp mynginxa7f1228cc3ae registry:2.6.2 "/entrypoint.sh /etc…" 13 hours ago Up 13 hours 0.0.0.0:5001->5000/tcp myregistryharry@bogon dockerfile % docker exec -it test5_host /bin/sh / # ifconfigeth0 Link encap:Ethernet HWaddr 02:42:AC:12:00:04 inet addr:172.18.0.4 Bcast:172.18.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:10 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:796 (796.0 B) TX bytes:0 (0.0 B)lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)/ # # 和宿主机公共
4.3 Container 模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。 Container模式示意图:
# 创建新容器共享test1网络harry@bogon dockerfile % docker run --name test5_container --network container:test1 -d busybox /bin/sh -c 'while true; do echo hello; sleep 10; done' harry@bogon dockerfile % docker run --name test6_container --network container:test1 -d busybox /bin/sh -c 'while true; do echo hello; sleep 10; done' # 查看下harry@bogon dockerfile % docker psCONTAINER ID IMAGE COMMAND CREATEDSTATUSPORTS NAMES500c12d01da8 busybox "/bin/sh -c 'while t…" About a minute ago Up About a minutetest6_container40b238642206 busybox "/bin/sh -c 'while t…" 2 minutes ago Up 2 minutes test5_container# 网络互通
4.4 None模式
使用none
模式,Docker 容器拥有自己的 Network Namespace,但是,并不为Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等。 None模式示意图:
验证一下:
# 创建none网络容器harry@bogon dockerfile % docker run --name test7_none --network none -d busybox /bin/sh -c 'while true; do echo hello; sleep 10; done' # 这种没有网卡和任何配置, 是ping 不通的,这种模式通常用于密码等敏感信息存储, 不想让外界访问
好啦🌶🌶🌶🌶🌶🌶, 喜欢的话点个赞吧~ ❤☕️