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.539                   
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基础详解的主要内容,如果未能解决你的问题,请参考以下文章

Python3 - Docker基础详解

Docker基础命令详解——镜像及容器操作

Docker技术详解(零基础入门使用教程)

docker使用常用基础命令详解版

Docker 基础详解

Docker基础 :网络配置详解