一、Docker的网络模式

当项目大规模使用 Docker 时,容器通信的问题也就产生了。要解决容器通信问题,必须先了解很多关于网络的知识。Docker一共有四种网络模式分别是host模式,container模式,none模式,bridge模式。

网络模式

参数

说明

host模式

--net=host

容器和宿主机共享

container模式

--net={id}

容器和另外一个容器共享

none模式

--net=none

容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,配置IP等

bridge模式

--net=bridge

默认为该模式,通过


1.1 Bridge模式

bridge模式是 docker 的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker 实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。


1.2 Host模式

如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。


1.3 Container模式

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。


1.4 None模式

使用none模式,Docker 容器拥有自己的 Network Namespace,但是,并不为Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等。


二、Docker重启策略

Docker容器的重启策略是面向生产环境的一个启动策略,在开发过程中可以忽略该策略。

Docker容器的重启都是由Docker守护进程完成的,因此与守护进程息息相关。

Docker容器的重启策略如下:

  • no,默认策略,在容器退出时不重启容器
  • on-failure,在容器非正常退出时(退出状态非0),才会重启容器
  • on-failure:3,指定启动的次数,在容器非正常退出时重启容器,最多重启3次
  • always,在容器退出时总是重启容器
  • unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

2.1 Docker容器的常见退出状态码

通过状态码我们可以大概判断出容器的情况

状态码

说明

0

正常退出

125

Docker守护进程本身错误

126

容器启动后,要执行的默认命令无法调用

127

容器启动后,要执行的默认命令不存在

其他

容器启动后正常执行的命令返回的状态码


三、Docker Compose工具

使用Compose 基本上分为三步:

  • Dockerfile 定义应用的运行环境
  • docker-compose.yml 定义组成应用的各服务
  • docker-compose up 启动整个应用


3.1 安装

[root@localhost ~]# curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

或者直接将下载好的离线包拷贝到/usr/local/bin目录下


[root@localhost ~]# chmod +x /usr/local/bin/docker-compose

[root@localhost ~]# docker-compose -v

安装后验证

查看版本

[root@localhost ~]# docker-compose version


查看命令帮助

[root@localhost ~]# docker-compose -h


3.2 Docker Compose 文件结构

案例1:

1:编写文件

compose默认的模板文件名字为docker-compose.yaml

[root@localhost ~]# vim docker-compose.yaml


version: '2'

services:

webapp:

image: 'httpd:latest'

ports:

- "80:80"

volumes:

- "/var/www/html:/usr/local/apache2/htdocs:rw"

注释:httpd的容器中网站的根目录在:/usr/local/apache2/htdocs

备注:

Compose 文件格式有3个版本,分别为1, 2.x 和 3.x 目前主流的为 3.x 其支持 docker 1.13.0 及其以上的版本


3.3 Docker Compose 常用命令

1:执行文件,生成容器

[root@localhost ~]# docker-compose up -d

注意:不加选项-d会在前台运行,结束该进程,这个容器就关闭了,加上-d后可以让容器在后台持续运行


2:列出当前运行的容器

[root@localhost ~]# docker-compose ps

    Name            Command        State         Ports       

-------------------------------------------------------------

root_webapp_1   httpd-foreground   Up      0.0.0.0:80->80/tcp


3:ps:列出所有运行容器

docker-compose ps


4:logs:查看服务日志输出

docker-compose logswebapp


5:port:打印绑定的公共端口

下面命令可以输出httpd服务80端口所绑定的公共端口

docker-compose port webapp 80


6:run:在一个服务上执行一个命令

docker-compose run webapp bash

备注:

红色部分是可以在容器中执行的命令,使用bash可以登录到容器中,可以换成其他的linux命令


7:重新构建:构建或者重新构建服务

(当yaml文件中的参数修改后,让容器使用新的参数重新运行)

打开docker-compose.yaml文件,将其中的映射端口改为8080:80,再执行以下命令

docker-compose up -d


docker-compose port webapp 80


8:start:启动指定服务已存在的容器

docker-compose start webapp


9:stop:停止已运行的服务的容器

docker-compose stop webapp


10:rm:删除指定服务的容器

docker-compose stop webapp

docker-compose rm webapp



11:kill:通过发送 SIGKILL 信号来停止指定服务的容器

docker-compose up -d


docker-compose kill webapp


12:scale:指定运行容器的个数(详细用法看扩展资料)

scale:设置指定服务运行容器的个数,以service=num 形式指定

docker-compose scale webapp=3

docker-compose up --scale webapp=3 -d

注意:先删除当前所有的容器,将文件中的端口注释掉

[root@localhost httpd]# cat docker-compose.yml


version: '2'

services:

  webapp:

    image: 'httpd:latest'

#    ports:

#      - "9090:80"

    volumes:

      - "/var/www/html:/usr/local/apache2/htdocs:rw"

后面可以跟多个服务名,以空格隔开,各容器之间不要有端口冲突,要使用随机端口进行映射做负载均衡用的


3.4  Docker Compose yml配置文件及常用指令简介

  1. 不支持制表符tab 键缩进,需要使用空格缩进。
  2. 通常开头缩进两个空格。
  3. 字符后缩进一个空格,如冒号、逗号、横杆。
  4. 用#号注释。
  5. 如果包含特殊字符,要使用单引号('')引起来。
  6. 布尔值(true、false、yes、no、on、off)必须用引号("")括起来,这样分析器会将它们解释为字符串。


3.5 compose的案例

案例2:

1:编写文件

[root@localhost ~]# vim docker-compose.yaml


version: '2'

services:

  webapp:

    image: 'nginx'

    ports:

      - "80:80"

    volumes:

      - "/www/html:/www/html:rw"

      - "/opt/nginx/nginx.conf:/etc/nginx/nginx.conf"


2:修改nginx配置文件

将nginx的配置文件上传到docker主机上

[root@localhost ~]# mkdir /opt/nginx

[root@localhost ~]# vim /opt/nginx/nginx.conf


#user  nobody;

worker_processes  1;


#pid        logs/nginx.pid;



events {

    worker_connections  1024;

}


http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    #tcp_nopush     on;


    #keepalive_timeout  0;

    keepalive_timeout  65;


    #gzip  on;


    server {

        listen       80;

        server_name  localhost;


        #charset koi8-r;


        #access_log  logs/host.access.log  main;


        location / {

            root   /www/html;

            index  index.html index.htm index.php;

        }


        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }


        location ~ \.php$ {

            root           /www/html;

            fastcgi_pass   127.0.0.1:9000;

            fastcgi_index  index.php;

            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

            include        fastcgi_params;

        }


    }


}


3:执行文件,生成容器

[root@localhost ~]# docker-compose up -d



4:列出当前运行的容器

[root@localhost ~]# docker-compose ps



[root@localhost ~]# docker-compose kill webapp


四、安装Harbor(worker节点)

在两台worker节点上分别安装Harbor,由于官方提供了安装脚本,安装过程还是比较简单的。具体步骤如下:

1:下载安装包

首先下载官方的离线安装包,当然你能上网的话使用在线安装包也可以:

https://github.com/goharbor/harbor/releases/tag/v2.4.3

https://github.com/goharbor/harbor/releases/download/v2.4.3/harbor-offline-installer-v2.4.3.tgz


2:下载完成后,将压缩包上传到两个worker节点:

[root@localhost ~]# lsharbor-offline-installer-v2.4.3.tgz[root@localhost ~]# lsharbor-offline-installer-v2.4.3.tgz


3:然后对其进行解压:

[root@localhost ~]# tar -zxvf harbor-offline-installer-v2.4.3.tgz

解压后的目录文件如下:

[root@localhost ~]# cd harbor

[root@localhost harbor]# lscommon.sh  harbor.v2.4.3.tar.gz  harbor.yml.tmpl  install.sh  LICENSE  prepare


4:配置harbor

将配置文件模板拷贝一份,并命名为harbor.yml,这是默认的配置文件名称:

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

编辑harbor.yml文件,按照如下说明修改几处配置项:

[root@localhost harbor]# vim harbor.yml

修改为当前所在节点的ip

hostname: 192.168.10.102

登录界面的密码

harbor_admin_password: pwd123

将https相关的配置给注释掉,这里为了简单只使用http,而且也可以在nginx那一层去做https

#https related config

#https:  

#https port for harbor, default is 443

#  port: 443  

#The path of cert and key files for nginx

#  certificate: /your/certificate/path

#  private_key: /your/private/key/path

注意:

注释掉https相关的行


5:安装docker-compose

准备好配置文件之后,安装docker-compose,因为Harbor的安装脚本是基于docker-compose去安装的。下载docker-compose然后放到/usr/local/bin/目录下,再更改一下权限即可:

[root@localhost ~]# curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

[root@localhost ~]# chmod 755 /usr/local/bin/docker-compose

备注:

也可以提前下载好直接拷贝到 /usr/local/bin目录下


6:运行Harbor的安装脚本

[root@localhost harbor]# ./install.sh


7:安装完成,使用浏览器访问Harbor,正常情况下应能进入登录界面:

Docker Compose与私有仓库部署_nginx

默认用户名为admin,密码则为配置文件中定义的密码。登录成功后页面如下:

Docker Compose与私有仓库部署_Docker_02


8:创建项目

Docker Compose与私有仓库部署_docker_03

Docker Compose与私有仓库部署_docker_04

Docker Compose与私有仓库部署_docker_05


五、客户端配置使用Harbor

Client节点操作

1:配置daemon.json文件

cat > /etc/docker/daemon.json << EOF

{

    "registry-mirrors": ["https://r9xxm8z8.mirror.aliyuncs.com"],

    "insecure-registries":["192.168.207.131"]

}

EOF

# "registry-mirrors": ["https://r9xxm8z8.mirror.aliyuncs.com"]这个是修改为国内的镜像源,使用国内的源访问速度会快一点

#insecure-registries是指定私有仓库


2: 重启Docker服务

systemctl daemon-reload

systemctl restart docker

六、 测试上传下载镜像

Client节点操作

1: 登录镜像仓库

[root@client ~]# docker login -uadmin -pHarbor12345 http://192.168.207.131

WARNING! Using --password via the CLI is insecure. Use --password-stdin.

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

Configure a credential helper to remove this warning. See

https://docs.docker.com/engine/reference/commandline/login/#credentials-store


Login Succeeded

# 连接仓库

# -u指定用户名

# -p 指定密码

# 最后要跟上Harbor仓库的地址


2:下载镜像

[root@client ~]# docker pull busybox

Using default tag: latest

latest: Pulling from library/busybox

5cc84ad355aa: Pull complete

Digest: sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678

Status: Downloaded newer image for busybox:latest

docker.io/library/busybox:latest


3:上传镜像

# 上传镜像首先修改镜像名称

[root@client ~]# docker images

REPOSITORY   TAG       IMAGE ID       CREATED         SIZE

busybox      latest    beae173ccac6   23 months ago   1.24MB


# 修改为Harbor仓库的ip/项目的名称/镜像名称:tag

[root@client ~]# docker tag busybox 192.168.207.131/demo/busybox:v1


# 上传镜像

[root@client ~]# docker push 192.168.207.131/demo/busybox:v1

The push refers to repository [192.168.207.131/demo/busybox]

01fd6df81c8e: Pushed

v1: digest: sha256:62ffc2ed7554e4c6d360bce40bbcf196573dd27c4ce080641a2c59867e732dee size: 527


4:验证

验证方式有两种可以通过web页面访问查看有没有上传的镜像,还可以通过命令行下载刚才上传的镜像,两者二选一即可。

(1)登录浏览器验证

Docker Compose与私有仓库部署_docker_06

Docker Compose与私有仓库部署_Docker_07


(2)下载验证

[root@client ~]# docker pull 192.168.207.131/demo/busybox:v1

v1: Pulling from demo/busybox

Digest: sha256:62ffc2ed7554e4c6d360bce40bbcf196573dd27c4ce080641a2c59867e732dee

Status: Image is up to date for 192.168.207.131/demo/busybox:v1

192.168.207.131/demo/busybox:v1