Python3 - Docker基础详解
Posted 韩俊强
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3 - Docker基础详解相关的知识,希望对你有一定的参考价值。
文章目录
1. Dockerfile的基本用法
mkdir mynginx
cd mynginx
vim Dockerfile
FROM nginx
RUN echo '<h1>hello world !!!!</h1>' > /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:v2
docker 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 centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos 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:v3
Untagged: 127.0.0.1:5001/nginx:v3
Untagged: 127.0.0.1:5001/nginx@sha256:42df2f3658c36b78c2dff700d2f3eb8a
# 如果想让内网的人都能访问呢?
ifconfig
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=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.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
192.168.0.4 为局域网ip
# 重新打包成 192.168.0.4 即可
# 重命名
harry@bogon dockerfile % docker tag nginx:v3 192.168.0.4:5001/nginx:v3
harry@bogon dockerfile % docker push 192.168.0.4:5001/nginx:v3
The 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"]
# 先删除一下myregistry
docker 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 ID CREATED SIZE
nginx v4 e3d89c83facd 12 hours ago 141MB
192.168.0.4:5001/nginx v2 ce095e23499e 17 hours ago 141MB
nginx v2 ce095e23499e 17 hours ago 141MB
mysql 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 ls
DRIVER VOLUME NAME
local 9bdbee9aa6ee681321cc63f459333e08589b295e118e99ea9cc8eabe3f9bf52d
local a94ce591b3b34b7b5cf07d620bcbc43c31797fc85ccb2f390ca5efdab31ec979
local ae99f461620c947882004c6a0f0f79a7fc29bae62385c3984649e9511e29f2a7
local da2f5c25f0e9eb9de5ae004fe55a86da4ea18d7ae92e9cbc0499b2c65ca0adf1
local vsCodeServerVolume-pear-admin-flask1-competent_poitras
查看mysql的详细信息:
# mysql详细详细
docker inspect mysql1
# 数据卷列表
harry@bogon dockerfile % docker volume ls
DRIVER VOLUME NAME
local 9bdbee9aa6ee681321cc63f459333e08589b295e118e99ea9cc8eabe3f9bf52d
local a94ce591b3b34b7b5cf07d620bcbc43c31797fc85ccb2f390ca5efdab31ec979
local ae99f461620c947882004c6a0f0f79a7fc29bae62385c3984649e9511e29f2a7
local da2f5c25f0e9eb9de5ae004fe55a86da4ea18d7ae92e9cbc0499b2c65ca0adf1
local 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"
]
# 进入mysql
harry@bogon dockerfile % docker exec -it mysql1 /bin/bash
root@6d45ac7ab3b4:/# mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \\g.
Your MySQL connection id is 2
Server 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 its
affiliates. Other names may be trademarks of their respective
owners.
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> exit
Bye
# 验证数据卷
# 先删掉mysql1
harry@bogon dockerfile % docker rm -f mysql1
# 再创建mysql5.7, 命名mysql2
docker run -d --name mysql2 -p 3309:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:5.7
# 进入查看下, 发现没有docker, 每次创建mysql都会重新创建volume
harry@bogon dockerfile % docker exec -it mysql2 /bin/bash
root@dc729a913665:/# mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \\g.
Your MySQL connection id is 2
Server 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 its
affiliates. Other names may be trademarks of their respective
owners.
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>
# 删除mysql2
docker 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
# 查看数据卷, 多了个mysql
harry@bogon dockerfile % docker volume ls
DRIVER VOLUME NAME
local 9bdbee9aa6ee681321cc63f459333e08589b295e118e99ea9cc8eabe3f9bf52d
local a94ce591b3b34b7b5cf07d620bcbc43c31797fc85ccb2f390ca5efdab31ec979
local ae99f461620c947882004c6a0f0f79a7fc29bae62385c3984649e9511e29f2a7
local b5fba44ed7e4b3b04ab8326bd3b803dcb131215e11e85607a129084b6434fbe5
local da2f5c25f0e9eb9de5ae004fe55a86da4ea18d7ae92e9cbc0499b2c65ca0adf1
local mysql
local 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/bash
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> exit
Bye
# 删除mysql2
harry@bogon dockerfile % docker rm -f mysql2
mysql2
# 查看数据卷, mysql依然存在
harry@bogon dockerfile % docker volume ls
DRIVER VOLUME NAME
local 9bdbee9aa6ee681321cc63f459333e08589b295e118e99ea9cc8eabe3f9bf52d
local a94ce591b3b34b7b5cf07d620bcbc43c31797fc85ccb2f390ca5efdab31ec979
local ae99f461620c947882004c6a0f0f79a7fc29bae62385c3984649e9511e29f2a7
local b5fba44ed7e4b3b04ab8326bd3b803dcb131215e11e85607a129084b6434fbe5
local da2f5c25f0e9eb9de5ae004fe55a86da4ea18d7ae92e9cbc0499b2c65ca0adf1
local mysql
local 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 mysql100
harry@bogon dockerfile % docker volume rm mysql
mysql
# 删除所有数据卷, 注意慎重, 确定没使用到
docker volume prune
3.2 挂载主机目录
我们来写个ngin的Dockerfile, 挂载数据卷
FROM nginx
#RUN echo '<h1>hello world !!!!</h1>' > /usr/share/nginx/html/index.html
WORKDIR /usr.share/nginx/html
COPY 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 .dockerignore 0.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 context 0.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 images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v4 091dd1ac7ba3 5 seconds ago 141MB
192.168.0.4:5001/nginx v2 ce095e23499e 5 hours ago 141MB
# 运行
harry@bogon dockerfile % docker run -d --name mynginx -p 8084:80 nginx:v4
ef431226664eca254c17233ec48c5b1c98dcbd34d958d1a693fe2beb33090b44
harry@bogon dockerfile % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ef431226664e nginx:v4 "/docker-entrypoint.…" 3 seconds ago Up 3 seconds 0.0.0.0:8084->80/tcp mynginx
a7f1228cc3ae registry:2.6.2 "/entrypoint.sh /etc…" 44 minutes ago Up 44 minutes 0.0.0.0:5001->5000/tcp myregistry
挂载目录
# 先删除一下nginx
docker 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 ls
NETWORK ID NAME DRIVER SCOPE
29876ce47f6a bridge bridge local
8df8a313b670 host host local
0f61296c066b 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
模式如下图所示:
验证一下:
# 启动docker1
docker run --name test1 -d busybox /bin/sh -c 'while true; do echo hello; sleep 10; done'
# 启动docker2
docker run --name test2 -d busybox /bin/sh -c 'while true; do echo hello; sleep 10; done'
# test1 ip:172.17.0.4
harry@bogon dockerfile % docker exec -it test1 /bin/sh
/ # ifconfig
eth0 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
/ # ifconfig
eth0 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.4
harry@bogon dockerfile % docker exec -it test2 /bin/sh
PING 172.17.0.4 (172.17.0.4): 56 data bytes
64 bytes from 172.17.0.4: seq=0 ttl=64 time=0.125 ms
64 bytes from 172.17.0.4: seq=1 ttl=64 time=0.128 ms
64 bytes from 172.17.0.4: seq=2 ttl=64 time=0.207 ms
# 在test1中ping test2 的ip
harry@bogon dockerfile % docker exec -it test1 /bin/sh
/ # ping 172.17.0.5
PING 172.17.0.5 (172.17.0.5): 56 data bytes
64 bytes from 172.17.0.5: seq=0 ttl=64 time=0.074 ms
64 bytes from 172.17.0.5: seq=1 ttl=64 time=0.094 ms
64 bytes from 172.17.0.5: seq=2 ttl=64 time=0.129 ms
64 bytes from 172.17.0.5: seq=3 ttl=64 time=0.131 ms
# 删除尝试关联
docker rm -f test2
docker 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 demo
02cae447fa347674a134ab2919860507f5c172912ad385a0e9ce60a426cc3c92
harry@bogon dockerfile % docker network ls
NETWORK ID NAME DRIVER SCOPE
29876ce47f6a bridge bridge local
02cae447fa34 demo bridge local
8df8a313b670 host host local
0f61296c066b none null local
# 创建test3
harry@bogon dockerfile % docker run --name test3 --network demo -d busybox /bin/sh -c 'while true; do echo hello; sleep 10; done'
ee5c4b7e94691cb5490023533269fd20e011cc64c1653b778559d9cbbf1f1c18
# 创建test4
harry@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, test4
harry@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_host
harry@bogon dockerfile % docker run --name test5_host --network demo -d busybox /bin/sh -c 'while true; do echo hello; sleep 10; done'
84bae4ee839d938462b3027acc90e01e066b3924c8367b0957d5863b5b79ee23
harry@bogon dockerfile % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
84bae4ee839d busybox "/bin/sh -c 'while t…" 38 seconds ago Up 37 seconds test5_host
a53e5e1d19b8 busybox "/bin/sh -c 'while t…" 4 minutes ago Up 4 minutes test4
ee5c4b7e9469 busybox "/bin/sh -c 'while t…" 5 minutes ago Up 5 minutes test3
5b98e1c9b29f busybox "/bin/sh -c 'while t…" 9 minutes ago Up 9 minutes test2
6a5ebeea20fa busybox "/bin/sh -c 'while t…" 20 minutes ago Up 20 minutes test1
92b43f6d4717 nginx:v4 "/docker-entrypoint.…" 12 hours ago Up 12 hours 0.0.0.0:8084->80/tcp mynginx
a7f1228cc3ae registry:2.6.2 "/entrypoint.sh /etc…" 13 hours ago Up 13 hours 0.0.0.0:5001->5000/tcp myregistry
harry@bogon dockerfile % docker exec -it test5_host /bin/sh
/ # ifconfig
eth0 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 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
500c12d01da8 busybox "/bin/sh -c 'while t…" About a minute ago Up About a minute test6_container
40b238642206 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 不通的,这种模式通常用于密码等敏感信息存储, 不想让外界访问
好啦🌶🌶🌶🌶🌶🌶, 喜欢的话点个赞吧~ ❤☕️
以上是关于Python3 - Docker基础详解的主要内容,如果未能解决你的问题,请参考以下文章