一、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配置文件及常用指令简介
- 不支持制表符tab 键缩进,需要使用空格缩进。
- 通常开头缩进两个空格。
- 字符后缩进一个空格,如冒号、逗号、横杆。
- 用#号注释。
- 如果包含特殊字符,要使用单引号('')引起来。
- 布尔值(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,正常情况下应能进入登录界面:
默认用户名为admin,密码则为配置文件中定义的密码。登录成功后页面如下:
8:创建项目
五、客户端配置使用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)登录浏览器验证
(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