05日目Dockerネットワークの詳細な説明
注:クラウドサーバーはデフォルトでポート80のみを公開するため、外部ネットワークを介してアクセスする場合は、ポート80にのみマップできます。
Docker0を理解する
すべてのミラーをクリーンアップします
docker rmi -f $(docker images -aq)
2、3つのネットワーク
2.1はじめに
dockerにはデフォルトで3つのネットワークモードがあり、docker network ls
それらを確認できます。
2.1ネットワークブリッジの作成(削除)
docker network create [网桥名称]
[root@s ~]# docker network create test01
------------------------------------------------------------------------
ce548d0dd9f88ac22d0d943d8f33dde4c2f81c04c4aeea9319cb3e879cc14945
[root@s ~]# docker network ls
------------------------------------------------------------------------
NETWORK ID NAME DRIVER SCOPE
c4197b1203c6 bridge bridge local
b24a96f44350 host host local
b37725ff8cc6 none null local
ce548d0dd9f8 test01 bridge local
[root@s ~]# docker network rm test01
------------------------------------------------------------------------
test01
[root@s ~]# docker network ls
------------------------------------------------------------------------
NETWORK ID NAME DRIVER SCOPE
c4197b1203c6 bridge bridge local
b24a96f44350 host host local
b37725ff8cc6 none null local
3.dockerは、同じブリッジコンテナが相互運用可能かどうかをテストします
3.1ブリッジを作成する
[root@s ~]# docker network create super
------------------------------------------------------------------------
3546c50a8479e3ec04fa008d770fdfabf448614b7b56c3ed417cad533d81fb97
3.2複数のコンテナを作成する(同じブリッジの下に)
3.2.1redis
[root@s ~]# docker run -d --name redis --network super redis
------------------------------------------------------------------------
6facf44e598df8eee101b288e16b199b1731a39a855406b6b6b99a11532e9ecd
3.2.2mysql:5.7
[root@s ~]# docker run -d --name mysql --network super -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
------------------------------------------------------------------------
41c68da6a684a1c733a31d59aea76af5a9a3e6a15e53834ddf416ff870b77a55
3.2.3nginx
[root@s ~]# docker run -d --name nginx --network super nginx
------------------------------------------------------------------------
77b7198f61eb552be672b318fcbec949a1ab9d300d93b8de9978c0eaa1a1014d
3.2.4centos
[root@s ~]# docker run -dit --name centos01 --network super centos /bin/sh
------------------------------------------------------------------------
7aa33a1ddcbba21e2af259bbf3251667a890be084567e3de565c993fe945b208
使って
質問:dockerはコンテナネットワークアクセスをどのように処理しますか?
コンテナを入力してIPアドレスを表示します
docker exec -it 容器id
ip addr
# 查看容器内部网络地址 发现容器启动的时候会得到一个 eth0@if551 ip地址,docker分配!
現時点では、Linuxはコンテナの内部にpingを実行できます。コンテナは外の世界にpingを送信することもできます-2つは相互運用可能です
原理
dockerコンテナを起動するたびに、dockerはdockerコンテナにIPを割り当てます。dockerをフォローしている限り、docker0ブリッジモードがあり、使用されるテクノロジーはveth-pairテクノロジーです。
コンテナを再開すると、もう1つのネットワークがあります
コンテナによってもたらされるネットワークは1対1です
veth-pairは、仮想デバイスインターフェイスのペアです。これらはすべてペアで表示されます。一方の端はプロトコルに接続され、もう一方の端は相互に接続されます。この機能により、veth-pairはOpenStacとを接続するためのブリッジとして機能します。さまざまな仮想ネットワークデバイスのDockerコンテナ。OVSとOVS間の接続にはevth-pairテクノロジーが使用されます。
次の2つのコンテナにpingを実行できるかどうかをテストするには
docker exec -it centos ip addr
------------------------------------------------------------------------
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
100: eth0@if101: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
docker exec -it b9a558d1c51a ping 172.17.0.2
------------------------------------------------------------------------
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.086 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.054 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.060 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.055 ms
# 是可以ping通的
このことから、centos1とcentos2はルーターを共有していると結論付けることができます。docker0
すべてのコンテナーがネットワークを指定していない場合、それらはdocker0によってルーティングされ、dockerはデフォルトの使用可能なIPをコンテナーに割り当てます。
概要:DockerはLinuxブリッジを使用し、ホストはDockerコンテナーブリッジdocker0です。
Dockerのすべてのネットワークインターフェイスは仮想であり、仮想転送効率は高いです(イントラネット転送ファイル)コンテナが削除されている限り、対応するブリッジペアはなくなります!
二、-link
$ docker exec -it tomcat02 ping tomca01 # ping不通
ping: tomca01: Name or service not known
# 运行一个tomcat03 --link tomcat02
$ docker run -d -P --name tomcat03 --link tomcat02 tomcat
5f9331566980a9e92bc54681caaac14e9fc993f14ad13d98534026c08c0a9aef
# 用tomcat03 ping tomcat02 可以ping通
$ docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.115 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.080 ms
# 用tomcat02 ping tomcat03 ping不通
3つのカスタムネットワーク
docker network
connect -- Connect a container to a network
create -- Creates a new network with a name specified by the
disconnect -- Disconnects a container from a network
inspect -- Displays detailed information on a network
ls -- Lists all the networks created by the user
prune -- Remove all unused networks
rm -- Deletes one or more networks
08日目のビルドイメージ
1.命令を書き込むためのファイル名が次のようになっている必要がある場合:Dockerfile
vim Dockerfile
2つ目は、ミラーを作成するための指示を書くことです
# 依赖镜像
FROM python:3.6.12
# 安装django
RUN pip3 install django==2.2.2 -i https://pypi.douban.com/simple/
# 添加本地Django文件(Test)到 镜像中的(Test)下
ADD /Test /Test
# 镜像执行 cd命令 并运行
CMD cd /Test && python3 manage.py runserver 0.0.0.0:8000
3、構築を開始します
docker build -t python:v1 . # 打开当前目录下的Dockerfield 构建python:v1镜像
4、検証
カスタム画像を開始
docker run -d -p8080:8000 python:v1
ポートマッピングを開始して指定します
起動後に終了した場合はdocker logs [容器id|名称]
、エラーメッセージを表示するために行くことができます
イントラネットアクセスが成功しました!
外网访问django中的settings.py 修改ALLOW_HOST = ["*"]
そして、ポートは次のようにマップされます80
5、nginxプロキシdjango
1.nginxイメージをビルドします
# Dockerfile
# 设置基础镜像
FROM centos:7
RUN yum install wget -y
# 换源
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
RUN cd /etc/yum.repos.d && wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
RUN mv /etc/yum.repos.d/CentOS7-Base-163.repo /etc/yum.repos.d/CentOS-Base.repo
# 创建nginx源的文件
ADD nginx.repo /etc/yum.repos.d/
# 刷新yum缓存
RUN yum makecache
# 安装yum工具
RUN yum install yum-utils -y
# 安装Nginx
RUN yum install nginx -y
# 复制配置文件
ADD default.conf /etc/nginx/conf.d/
# 设置启动命令
CMD nginx -g 'daemon off;'
# nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
upstream
このモジュールはnginx
、単一のマシンの制限を超えて、ネットワークデータの受信、処理、および転送を完了します。
# default.conf
upstream django {
server django:8000; # 此处代理的时 容器名和端口号
}
server {
listen 80;
server_name _;
location / {
:
proxy_pass http://django; # 与上面对应
index index.html index.htm;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
2つのファイルが/home
ディレクトリにあるので、CDを入力したい
cd /home
docker build -t nginx:v1 . # 小数点代表当前目录
2.djangoイメージを作成します
# Dockerfile
依赖镜像
FROM python:3.6
# 安装django
RUN pip3 install django==2.1.7 -i https://pypi.douban.com/simple/
# 创建项目
RUN django-admin startproject test
# 进入到项目下 启动项目
RUN cd test && django-admin startapp app01
# 镜像执行 cd命令 并运行
CMD cd test && python3 manage.py runserver 0.0.0.0:8000
docker build -t python:v1 . # 小数点代表当前目录
3.実行を開始します。同じネットワーク上にある必要があります
docker run -d --network oldboy --name django python:v1
------------------------------------------------------------------------
82ae3f1e3d9d4bdc56489205a39cf49912939058707a4ebddae8a7c9a0b8c8b0
docker run -d -p80:80 --network oldboy nginx:v3
------------------------------------------------------------------------
776ce7cd6154ebfbdd4454927013175db1c25fe7e9f97f7a0d0e7b7103dba24e
docker ps
------------------------------------------------------------------------
NTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
776ce7cd6154 nginx:v3 "/bin/sh -c 'nginx -…" 3 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp infallible_mestorf
82ae3f1e3d9d python:v1 "/bin/sh -c 'cd test…" 8 minutes ago Up 8 minutes django
テストできます