目录

Docker篇

Docker篇

1.docker环境搭建:

1.1软件仓库的配置rhel9:

#cd/etc/yum.repos.d

#vim docker.repo

[docker]

name=docker-ce

baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable

gpgcheck=0

1.2安装docker并且启动服务

yum install -y docker-ce

#编辑docker启动文件,设定其使用iptables的网络设定方式,默认使用nftables

[root@docker ~]# vim /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -H fd:// –containerd=/run/containerd/containerd.sock –iptables=true

systemctl  enable –now docker

docker info

在rhel7中 需要

]# vim /etc/sysctl.d/docker.conf

net.bridge.bridge-nf-call-iptables = 1

net.bridge.bridge-nf-call-ip6tables = 1

net.ipv4.ip_forward = 1

]# sysctl –system

]# systemctl  restart docker

2.1Docker镜像管理

[root@Docker-node1 ~]# docker search  nginx

NAME           DESCRIPTION                                      STARS     OFFICIAL

nginx          Official build of Nginx.                         20094     [OK]

@@@省略内容

NAME镜像名称
DESCRIPTION镜像说明
STARS点赞数量
OFFICIAL是否是官方的

#从镜像仓库中拉取镜像(拉取速度较慢)

[root@Docker-node1 ~]# docker pull busybox

[root@Docker-node1 ~]# docker pull nginx:1.26-alpine

#查看本地镜像

[root@Docker-node1 ~]# docker images

REPOSITORY                        TAG           IMAGE ID       CREATED         SIZE

nginx                             latest        900dca2a61f5   7 weeks ago     188MB

nginx                             1.26-alpine   b32ed582bddb   7 weeks ago     43.2MB

ubuntu                            latest        35a88802559d   2 months ago    78.1MB

busybox                           latest        65ad0d468eb1   15 months ago   4.26MB

centos                            7             eeb6ee3f44bd   2 years ago     204MB

centos                            latest        5d0da3dc9764   2 years ago     231MB

gcr.io/distroless/base-debian12   latest        7273f3276b21   N/A             20.7MB

gcr.io/distroless/base-debian11   latest        2a6de77407bf   N/A             20.6MB

#查看镜像信息

[root@Docker-node1 ~]# docker image inspect nginx:1.26-alpine

导出镜像

[root@Docker-node1 ~]# docker image save nginx:latest -o nginx-latest.tar.gz

[root@Docker-node1 ~]# docker image save nginx:latest nginx:1.26-alpine -o nginx.tag.gz

保存所有镜像

[root@Docker-node1 ~]# docker save  docker images | awk 'NR>1{print $1":"$2}' -o images.tar.gz (-o指定导出镜像位置,可以同时导出多个镜像到一个文件,指定.tar.gz可以导出并压缩)

删除镜像:

[root@Docker-node1 ~]# docker rmi nginx:latest

删除所有镜像

[root@Docker-node1 ~]# docker rmi  docker images | awk 'NR>1{print $1":"$2}'

2.2启动容器

[root@Docker-node1 ~]# docker run  -d –name mario -p 80:8080 timinglee/mario

[root@Docker-node1 ~]# docker run -it –name centos7 centos:7

[root@3ba22e59734f /]#    #进入到容器中,按+退出并停止容器,#按+退出但不停止容器

#重新进入容器

[root@docker ~]# docker attach centos7

[root@3ba22e59734f /]#

#在容器中执行命令

[root@docker ~]# docker exec -it  test ifconfig

lo        Link encap:Local Loopback

inet addr:127.0.0.1  Mask:255.0.0.0

inet6 addr: ::1/128 Scope:Host

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)

-d            #后台运行

-i            #交互式运行

-t            #打开一个终端

–name        #指定容器名称

-p            #端口映射 -p 80:8080    把容器8080端口映射到本机80端口

–rm        #容器停止自动删除容器

–network     #指定容器使用的网络

2.3容器进程查看

[root@Docker-node1 ~]# docker ps                    #查看当前运行容器

[root@Docker-node1 ~]# docker ps -a                    #查看所有容器

[root@Docker-node1 ~]# docker inspect busybox        #查看容器运行的详细信息

2.4停止和运行容器

[root@Docker-node1 ~]# docker stop b-怕usybox            #停止容器

[root@Docker-node1 ~]# docker kill busybox            #杀死容器,可以使用信号

[root@Docker-node1 ~]# docker start busybox            #开启停止的容器

2.5删除容器

[root@Docker-node1 ~]# docker rm centos7            #删除停止的容器

[root@Docker-node1 ~]# docker rm -f busybox            #删除运行的容器

[root@Docker-node1 ~]# docker container prune -f    #删除所有停止的容器

2.6容器内容提交

默认情况下,容器被删除后,在容器中的所有操作都会被清理,包括要保存的文件

如果想永久保存,那么我们需要把动作提交,提交后会生成新的镜像

当我们在运行新镜像后即可看到我们提交的内容

[root@Docker-node1 ~]# docker run -it –name test busybox

/ # touch leefile                                            #在容器中建立文件

/ # ls

bin      etc      leefile  lib64    root     tmp      var

dev      home     lib      proc     sys      usr

/ #

[root@Docker-node1 ~]# docker rm test    #删掉容器后

test

[root@Docker-node1 ~]# docker run -it –name test busybox    #删掉容器后开启新的容器文件不存在

/ # ls

bin    dev    etc    home   lib    lib64  proc   root   sys    tmp    usr    var

/ #

[root@Docker-node1 ~]# docker commit -m “add leefile” test  busybox:v1

sha256:c8ff62b7480c951635acb6064acdfeb25282bd0c19cbffee0e51f3902cbfa4bd

[root@Docker-node1 ~]# docker images

REPOSITORY                        TAG           IMAGE ID       CREATED          SIZE

busybox                           v1            c8ff62b7480c   12 seconds ago   4.26MB

[root@Docker-node1 ~]# docker image history busybox:v1

IMAGE          CREATED         CREATED BY                          SIZE      COMMENT

c8ff62b7480c   2 minutes ago   sh                                  17B       add leefile

65ad0d468eb1   15 months ago   BusyBox 1.36.1 (glibc), Debian 12   4.26MB

此方法企业一般不用 企业一般写dockerfile构建镜像

2.7系统中文件和容器中文件传输

[root@Docker-node1 ~]# docker cp  test2:/leefile /mnt        #把容器中的文件复制到本机

Successfully copied 1.54kB to /mnt

[root@Docker-node1 ~]# docker cp /etc/fstab  test2:/fstab    #把本机文件复制到容器中

查看容器内部日志:docker logs web

2.dockers镜像的构建
2.1镜像获取方式:
  • 本镜像通常由软件官方提供

  • 企业镜像可以用官方镜像+Dockerfile来生成

  • 系统关于镜像的获取动作有两种:

    • docker pull 镜像地址
    • docker load –i 本地镜像包
2.2构建参数
FROM指定base镜像 eg:FROM busybox:version
COPY复制文件 eg:COPY file /file 或者 COPY [“file”,”/”]
MAINTAINER指定作者信息,比如邮箱 eg:MAINTAINER 在最新版的docker中用LABEL KEY=“VALUE"代替
ADD功能和copy相似,指定压缩文件或url eg: ADD test.tar /mnt 或者 eg:ADD /mnt
ENV指定环境变量 eg:ENV FILENAME test
EXPOSE暴漏容器端口 eg:EXPOSE 80
VOLUME申明数据卷,通常指数据挂载点 eg:VOLUME [“/var/www/html”]
WORKDIR切换路径 eg:WORKDIR /mnt
RUN在容器中运行的指令 eg: touch file
CMD在启动容器时自动运行动作可以被覆盖 eg:CMD echo $FILENAME 会调用shell解析 eg:CMD [“/bin/sh”,”-c”,“echo $FILENAME”] 不调用shell解析
ENTRYPOINT和CMD功能和用法类似,但动作不可被覆盖
3.docker公有仓库和私有仓库

Docker Hub 是 Docker 官方提供的一个公共的镜像仓库服务。

它是 Docker 生态系统中最知名和广泛使用的镜像仓库之一,拥有大量的官方和社区贡献的镜像。

以下是 Docker Hub 的一些关键特点和优势:

  1. 丰富的镜像资源:涵盖了各种常见的操作系统、编程语言运行时、数据库、Web 服务器等众多应用的镜像。

    • 例如,您可以轻松找到 Ubuntu、CentOS 等操作系统的镜像,以及 MySQL、Redis 等数据库的镜像。
  2. 官方支持:提供了由 Docker 官方维护的一些重要镜像,确保其质量和安全性。

  3. 社区贡献:开发者们可以自由上传和分享他们创建的镜像,促进了知识和资源的共享。

  4. 版本管理:对于每个镜像,通常都有多个版本可供选择,方便用户根据需求获取特定版本。

  5. 便于搜索:用户可以通过关键词轻松搜索到所需的镜像。

docker hub的使用方法:

#登陆官方仓库

[root@docker ~]# docker login

Log in with your Docker ID or email address to push and pull images from Docker Hub. If you don’t have a Docker ID, head over to to create one.

You can log in with your password or a Personal Access Token (PAT). Using a limited-scope PAT grants better security and is required for organizations using SSO. Learn more at

Username: timinglee

Password:

WARNING! Your password will be stored unencrypted in /root/.docker/config.json.

Configure a credential helper to remove this warning. See

Login Succeeded

#登陆信息保存位置

[root@docker ~]# cd .docker/

[root@docker .docker]# ls

config.json

[root@docker .docker]# cat config.json

{

“auths”: {

“ : {

“auth”: “dGltaW5nbGVlOjY3NTE1MTVtaW5nemxu”

}

}

[root@docker ~]# docker tag gcr.io/distroless/base-debian11:latest  timinglee/base-debian11:latest

[root@docker ~]# docker push  timinglee/base-debian11:latest

The push refers to repository [docker.io/timinglee/base-debian11]

6835249f577a: Pushed

24aacbf97031: Pushed

8451c71f8c1e: Pushed

2388d21e8e2b: Pushed

c048279a7d9f: Pushed

1a73b54f556b: Pushed

2a92d6ac9e4f: Pushed

bbb6cacb8c82: Pushed

ac805962e479: Pushed

af5aa97ebe6c: Pushed

4d049f83d9cf: Pushed

9ed498e122b2: Pushed

577c8ee06f39: Pushed

5342a2647e87: Pushed

latest: digest: sha256:f8179c20f1f2b1168665003412197549bd4faab5ccc1b140c666f9b8aa958042 size: 3234

镜像拉取pull原理:docker客户端向index发送镜像拉取请求,index向客户端提供token和registry的位置,然后去找到registry做认证,registry向index确认docker客户端的合法性,index确认docker客户端合法,然后确认请求传递镜像到客户端

镜像上传push原理:docker客户端向index发送镜像上传请求,index向客户端发送认证token和registry位置,客户端拿着token去和registry做认证,registry向index确认docker客户端的合法性 index确认合法 然后根据客户端请求上传镜像

docker registry私有仓库:

docker hub虽然方便,但是还是有限制

  • 需要internet连接,速度慢
  • 所有人都可以访问
  • 由于安全原因企业不允许将镜像放到外网

搭建简单的私有仓库

的配置(在/etc/docker/daemon.json)

1.下载Registry镜像

docker pull registry

2.开启Registry(私有仓库)

docker run -d -p 5000:5000 –restart=always –name registry registry

知识点:1、了解到 它的默认端口是5000;2、简单了解–restart=always的使用,它的含义是容器出现故障时默认无限次的尝试重启。

3.上传镜像到私有仓库中

#docker在上传的过程中默认使用https,但是我们并没有建立https认证需要的认证文件所以会报错,所以先配置非加密端口

vim/etc/docker/daemon.json

{

“insecure-registries” : [“http://172.25.254.100:5000”]

}

systemctl restart docker

#注意:1、push前需要给将要上传的镜像打tag;2、push时需要给镜像指定tag标签,否则会push失败。

首先给上传的镜像打上标签 docker tag busybox:latest  172.25.254.100:5000/busybox:latest

然后docker images查看镜像是否成功打上标签

然后在push :docker push 172.25.254.100:5000/busybox:latest

查看是否上传成功:curl 172.25.254.100:5000/v2/_catalog

{“repositories”:[“busybox”]}

4.构建企业级docker harbor

Harbor 是由vmware公司开源的企业级 Docker Registry 项目。

它提供了以下主要功能和特点:

  1. 基于角色的访问控制(RBAC):可以为不同的用户和用户组分配不同的权限,增强了安全性和管理的灵活性。
  2. 镜像复制:支持在不同的 Harbor 实例之间复制镜像,方便在多个数据中心或环境中分发镜像。
  3. 图形化用户界面(UI):提供了直观的 Web 界面,便于管理镜像仓库、项目、用户等。
  4. 审计日志:记录了对镜像仓库的各种操作,有助于追踪和审查活动。
  5. 垃圾回收:可以清理不再使用的镜像,节省存储空间。

部署企业级harbor仓库首先要做加密认证

#openssl req -newkey  rsa:4096 \

-nodes -sha256 -keyout certs/timinglee.org.key \

-addext “subjectAltName = DNS: reg.timinglee.org” \        #指定备用名称

-x509 -days 365 -out certs/timinglee.org.crt

mkdir /data/创建一个目录 将证书考入这个目录下面

cp /root/certs/ /data/ -r

[root@docker ~]# tar zxf harbor-offline-installer-v2.5.4.tgz

[root@docker ~]# ls

anaconda-ks.cfg  certs   harbor-offline-installer-v2.5.4.tgz

auth             harbor

[root@docker ~]# cd harbor/

[root@docker harbor]# cp harbor.yml.tmpl harbor.yml

[root@docker harbor]# vim harbor.yml https://i-blog.csdnimg.cn/direct/6c91b1e8943f4892bce14cd28c7e4bf6.png

https://i-blog.csdnimg.cn/direct/02572c4a70504cedb1d4672c014dead0.png

hostname: reg.timinglee.org

certificate: /data/certs/timinglee.org.crt

private_key: /data/certs/timinglee.org.key

harbor_admin_password: lee

[root@docker harbor]# ./install.sh –help

Please set –with-notary                 #证书签名

Please set –with-trivy                  #安全扫描

Please set –with-chartmuseum if needs enable Chartmuseum in Harbor

[root@docker harbor]# ./install.sh –with-chartmuseum

可以通过访问ip或域名进入harbor 如果windows上需要对此ip进行解析

目录:C:\Windows\System32\drivers\etc\hosts

#管理harbor的容器

[root@docker harbor]# docker compose stop

[root@docker harbor]# docker compose  up -d

管理仓库:

#docker login reg.timinglee.org

user:

passwd:

[root@docker harbor]# docker tag busybox:latest  reg.timinglee.org/timinglee/busybox:latest

[root@docker harbor]# docker push reg.timinglee.org/timinglee/busybox:latest

The push refers to repository [reg.timinglee.org/timinglee/busybox]

d51af96cf93e: Pushed

latest: digest: sha256:28e01ab32c9dbcbaae96cf0d5b472f22e231d9e603811857b295e61197e40a9b size: 527

docker的weBUI工具:导入开源镜像包1panel-v1.10.13-lts-linux-amd64.tar.gz

sh install.sh

https://i-blog.csdnimg.cn/direct/f284e68020b946698f52e593204903e1.png

1ptctl user-info

https://i-blog.csdnimg.cn/direct/dcd37e3f2a9548949018c1fd4743646c.png

5.docker网络

ocker的镜像是令人称道的地方,但网络功能还是相对薄弱的部分

docker安装后会自动创建3种网络:bridge、host、none

[root@docker harbor]# docker network ls

NETWORK ID     NAME      DRIVER    SCOPE

2a93d6859680   bridge    bridge    local

4d81ddd9ed10   host      host      local

8c8c95f16b68   none      null      local

5.1docker bridge网络

[root@docker mnt]# ip link show type bridge

3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default

link/ether 02:42:5f:e2:34:6c brd ff:ff:ff:ff:ff:ff

  • bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的。
  • 容器通过宿主机的NAT规则后可以访问外网
5.2docker原生网络host

host网络模式需要在容器创建时指定 –network=host

host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性

[root@docker ~]# docker run -it --name test  --network host busybox
/ # ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:5F:E2:34:6C
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::42:5fff:fee2:346c/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:21264 errors:0 dropped:0 overruns:0 frame:0
          TX packets:27359 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1497364 (1.4 MiB)  TX bytes:215202367 (205.2 MiB)
eth0      Link encap:Ethernet  HWaddr 00:0C:29:EC:FC:D3
          inet addr:172.25.254.100  Bcast:172.25.254.255  Mask:255.255.255.0
          inet6 addr: fe80::30b2:327e:b13a:31cf/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1902507 errors:0 dropped:0 overruns:0 frame:0
          TX packets:831640 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2202443300 (2.0 GiB)  TX bytes:849412124 (810.0 MiB)
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:11819 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11819 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1279944 (1.2 MiB)  TX bytes:1279944 (1.2 MiB)
​如果公用一个网络,那么所有的网络资源都是公用的,比如启动了nginx容器那么真实主机的80端口被占用,在启动第二个nginx容器就会失败 
5.3docker原生网络none

none模式是指禁用网络功能,只有lo接口,在容器创建时使用

–network=none指定。

[root@docker ~]# docker run -it –name test –rm –network none  busybox

/ # ifconfig

lo        Link encap:Local Loopback

inet addr:127.0.0.1  Mask:255.0.0.0

inet6 addr: ::1/128 Scope:Host

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)

5.4docker自定义网络

自定义网络模式,docker提供了三种自定义网络驱动:

  • bridge
  • overlay
  • macvlan

bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,

overlay和macvlan是用于创建跨主机网络

建议使用自定义的网络来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址。

5.4.1自定义桥接网络

在建立自定以网络时,默认使用桥接模式

[root@docker ~]# docker network create my_net1

f2aae5ce8ce43e8d1ca80c2324d38483c2512d9fb17b6ba60d05561d6093f4c4

[root@docker ~]# docker network ls

NETWORK ID     NAME      DRIVER    SCOPE

2a93d6859680   bridge    bridge    local

4d81ddd9ed10   host      host      local

f2aae5ce8ce4   my_net1   bridge    local

8c8c95f16b68   none      null      local

桥接默认是单调递增

root@docker ~]# ifconfig

br-f2aae5ce8ce4: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500

inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255

ether 02:42:70:57:f2:82  txqueuelen 0  (Ethernet)

RX packets 21264  bytes 1497364 (1.4 MiB)

RX errors 0  dropped 0  overruns 0  frame 0

TX packets 27359  bytes 215202367 (205.2 MiB)

TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500

inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255

inet6 fe80::42:5fff:fee2:346c  prefixlen 64  scopeid 0x20

ether 02:42:5f:e2:34:6c  txqueuelen 0  (Ethernet)

RX packets 21264  bytes 1497364 (1.4 MiB)

RX errors 0  dropped 0  overruns 0  frame 0

TX packets 27359  bytes 215202367 (205.2 MiB)

TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

桥接也支持自定义子网和网关

[root@docker ~]# docker network create my_net2 –subnet 192.168.0.0/24 –gateway 192.168.0.100

7e77cd2e44c64ff3121a1f1e0395849453f8d524d24b915672da265615e0e4f9

[root@docker ~]# docker network  inspect my_net2

[

{

“Name”: “my_net2”,

“Id”: “7e77cd2e44c64ff3121a1f1e0395849453f8d524d24b915672da265615e0e4f9”,

“Created”: “2024-08-17T17:05:19.167808342+08:00”,

“Scope”: “local”,

“Driver”: “bridge”,

“EnableIPv6”: false,

“IPAM”: {

“Driver”: “default”,

“Options”: {},

“Config”: [

{

“Subnet”: “192.168.0.0/24”,

“Gateway”: “192.168.0.100”

}

]

},

“Internal”: false,

“Attachable”: false,

“Ingress”: false,

“ConfigFrom”: {

“Network”: "”

},

“ConfigOnly”: false,

“Containers”: {},

“Options”: {},

“Labels”: {}

}

]

5.4.2为什么要自定义桥接

多容器之间如何互访?通过ip可以,但是有什么问题?

[root@docker ~]# docker run  -d –name web1 nginx

d5da7eaa913fa6cdd2aa9a50561042084eca078c114424cb118c57eeac473424

[root@docker ~]# docker run  -d –name web2 nginx

0457a156b02256915d4b42f6cc52ea71b18cf9074ce550c886f206fef60dfae5

[root@docker ~]# docker inspect  web1

“Networks”: {

“bridge”: {

“IPAMConfig”: null,

“Links”: null,

“Aliases”: null,

“MacAddress”: “02:42:ac:11:00:03”,

“DriverOpts”: null,

“NetworkID”: “2a93d6859680b45eae97e5f6232c3b8e070b1ec3d01852b147d2e1385034bce5”,

“EndpointID”: “4d54b12aeb2d857a6e025ee220741cbb3ef1022848d58057b2aab544bd3a4685”,

“Gateway”: “172.17.0.1”,

“IPAddress”: “172.17.0.2”,        #注意ip信息

“IPPrefixLen”: 16,

“IPv6Gateway”: “”,

“GlobalIPv6Address”: “”,

“GlobalIPv6PrefixLen”: 0,

“DNSNames”: null

[root@docker ~]# docker inspect  web1

“Networks”: {

“bridge”: {

“IPAMConfig”: null,

“Links”: null,

“Aliases”: null,

“MacAddress”: “02:42:ac:11:00:03”,

“DriverOpts”: null,

“NetworkID”: “2a93d6859680b45eae97e5f6232c3b8e070b1ec3d01852b147d2e1385034bce5”,

“EndpointID”: “4d54b12aeb2d857a6e025ee220741cbb3ef1022848d58057b2aab544bd3a4685”,

“Gateway”: “172.17.0.1”,

“IPAddress”: “172.17.0.3”,        #注意ip信息

“IPPrefixLen”: 16,

“IPv6Gateway”: “”,

“GlobalIPv6Address”: “”,

“GlobalIPv6PrefixLen”: 0,

“DNSNames”: null

#关闭容器后重启容器,启动顺序调换

[root@docker ~]# docker stop web1 web2

web1

web2

[root@docker ~]# docker start web2

web2

[root@docker ~]# docker start web1

web1

#我们会发容器ip颠倒

docker引擎在分配ip时时根据容器启动顺序分配到,谁先启动谁用,是动态变更的

多容器互访用ip很显然不是很靠谱,那么多容器访问一般使用容器的名字访问更加稳定

docker原生网络是不支持dns解析的,自定义网络中内嵌了dns

5.4.3如何让不同的自定义网络互通

在其中一个容器中加上另一个容器的一块网卡

[root@docker ~]# docker run -d  –name web1 –network my_net1 nginx

[root@docker ~]# docker run  -it –name test –network my_net2 busybox

/ # ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:C0:A8:00:01

inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

RX packets:36 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:5244 (5.1 KiB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback

inet addr:127.0.0.1  Mask:255.0.0.0

inet6 addr: ::1/128 Scope:Host

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)

/ # ping 172.18.0.2

PING 172.18.0.2 (172.18.0.2): 56 data bytes

[root@docker ~]# docker network connect my_net1 test

#在上面test容器中加入网络eth1

/ # ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:C0:A8:00:01

inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

RX packets:45 errors:0 dropped:0 overruns:0 frame:0

TX packets:8 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:5879 (5.7 KiB)  TX bytes:602 (602.0 B)

eth1      Link encap:Ethernet  HWaddr 02:42:AC:12:00:03

inet addr:172.18.0.3  Bcast:172.18.255.255  Mask:255.255.0.0

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

RX packets:15 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:2016 (1.9 KiB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback

inet addr:127.0.0.1  Mask:255.0.0.0

inet6 addr: ::1/128 Scope:Host

UP LOOPBACK RUNNING  MTU:65536  Metric:1

RX packets:4 errors:0 dropped:0 overruns:0 frame:0

TX packets:4 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:212 (212.0 B)  TX bytes:212 (212.0 B)

5.4.4joined容器网络

Joined容器一种较为特别的网络模式,•在容器创建时使用–network=container:vm1指定。(vm1指定的是运行的容器名)

处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。

利用容器部署phpmyadmin管理mysql

#运行phpmysqladmin

[root@docker ~]# docker run -d –name mysqladmin –network my_net1 \

-e PMA_ARBITRARY=1 \                #在web页面中可以手动输入数据库地址和端口

-p 80:80 phpmyadmin:latest

#运行数据库

root@docker ~]# docker run  -d –name mysql \

-e MYSQL_ROOT_PASSWORD=‘lee’ \                    #设定数据库密码

–network container:mysqladmin  \                #把数据库容器添加到phpmyadmin容器中

mysql:5.7

开启的phpmyadmin容器中是没有数据库的

这里填写的localhost:3306是因为mysql容器和phpmyadmin容器公用一个网络站

Docker compose

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。

用来帮助你在 Docker 中同时管理多个容器。你可以把它想象成一个“一键启动”按钮,让你轻松运行多个相关的服务

其是官方的一个开源项目,托管到github上

Docker compose可以理解为shell脚本 一次性执行多个容器启动命令

主要功能

  1. 定义服务

    • 使用 YAML 格式的配置文件来定义一组相关的容器服务。每个服务可以指定镜像、端口映射、环境变量、存储卷等参数。
    • 例如,可以在配置文件中定义一个 Web 服务和一个数据库服务,以及它们之间的连接关系。
  2. 一键启动和停止

    • 通过一个简单的命令,可以启动或停止整个应用程序所包含的所有容器。这大大简化了多容器应用的部署和管理过程。
    • 例如,使用 docker-compose up 命令可以启动配置文件中定义的所有服务,使用 docker-compose down 命令可以停止并删除这些服务。
  3. 服务编排

    • 可以定义容器之间的依赖关系,确保服务按照正确的顺序启动和停止。例如,可以指定数据库服务必须在 Web 服务之前启动。
    • 支持网络配置,使不同服务的容器可以相互通信。可以定义一个自定义的网络,将所有相关的容器连接到这个网络上。
  4. 环境变量管理

    • 可以在配置文件中定义环境变量,并在容器启动时传递给容器。这使得在不同环境(如开发、测试和生产环境)中使用不同的配置变得更加容易。
    • 例如,可以定义一个数据库连接字符串的环境变量,在不同环境中可以设置不同的值。

工作原理

  1. 读取配置文件

    • Docker Compose 读取 YAML 配置文件,解析其中定义的服务和参数。
  2. 创建容器

    • 根据配置文件中的定义,Docker Compose 调用 Docker 引擎创建相应的容器。它会下载所需的镜像(如果本地没有),并设置容器的各种参数。
  3. 管理容器生命周期

    • Docker Compose 监控容器的状态,并在需要时启动、停止、重启容器。
    • 它还可以处理容器的故障恢复,例如自动重启失败的容器。

Docker Compose 中的管理层

  1. 服务 (service) 一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
  2. 项目 (project) 由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义
  3. 容器(container)容器是服务的具体实例,每个服务可以有一个或多个容器。容器是基于服务定义的镜像创建的运行实例

Docker compose常用命令参数

docker compose up 启动时默认找的文件是 docker-compose.yml

要是没有 需要指定文件名 :docker compose -f 文件名 up -d

docker compose stop停止正在运行的服务

docker compose down停止并删除正在运行的服务

docker compose start启动已存在的服务但是不会创建新的服务

docker compose restart 重启服务

Docker compose ps服务状态查看(注意:必须要进入.yml存在的目录才能查看)

docker compose logs 查看服务的日志输出

docker-compose exec 在正在运行的容器中执行命令

services:

test:

image: busybox

command: ["/bin/sh”,"-c",“sleep 3000”]

restart: always

container_name: busybox1

[root@docker test]# docker compose -f test.yml  up -d

[root@docker test]# docker compose  -f test.yml  exec  test sh

/ #

docker-compose pull :拉取配置文件中定义的服务所使用的镜像

[root@docker test]# docker compose -f test.yml pull

[+] Pulling 2/2

✔ test Pulled

✔ ec562eabd705 Pull complete

Docker compose build