SourceURL:file:///home/student/Desktop/容器技术.doc
对外发布服务
端口绑定
- docker run -itd -p 宿主机端口:容器端口 镜像:标签
# 端口绑定
[root@docker ~]# docker run -itd --rm --name web -p 80:80 myos:nginx
# 绑定后,直接访问宿主机的 IP 地址即可
[root@docker ~]# curl http://192.168.88.31
Nginx is running !
# 一个端口只能绑定唯一容器
[root@docker ~]# docker run -itd --rm -p 80:80 myos:httpd
Bind for 0.0.0.0:80 failed: port is already allocated.
# 使用不同端口绑定
[root@docker ~]# docker run -itd --rm -p 8080:80 myos:httpd
3c22b1d9c7484c03648d9c64fe073953fb9460015b6f2a
# 绑定后,访问验证
[root@docker ~]# curl http://192.168.88.31:8080
Welcome to The Apache.
容器存储卷
- docker run -itd -v 宿主机对象:容器内对象 镜像:标签
数据卷目录
# 创建卷目录,并添加测试页面
[root@docker ~]# mkdir /var/webroot
[root@docker ~]# echo "hello world" >/var/webroot/index.html
# 使用卷映射数据目录
[root@docker ~]# docker rm -f web
[root@docker ~]# docker run -itd --rm --name web -p 80:80 \
-v /var/webroot:/usr/local/nginx/html myos:nginx
[root@docker ~]# curl http://192.168.88.31/
hello world
# 修改数据卷内容可以直接在容器内体现
[root@server s4]# rsync -av public/info.php 192.168.88.31:/var/webroot/
[root@server s4]# curl http://192.168.88.31/info.php
<?PHP
修改配置文件
# 获取配置文件
[root@docker ~]# docker cp web:/usr/local/nginx/conf ./conf
Successfully copied 45.1kB to /root/conf
# 编辑配置文件,添加 php 解析配置
[root@docker ~]# vim conf/nginx.conf
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
# 使用卷映射配置文件,重建 nginx 容器
[root@docker ~]# docker rm -f web
[root@docker ~]# docker run -itd --rm --name web -p 80:80 \
-v /root/conf:/usr/local/nginx/conf \
-v /var/webroot:/usr/local/nginx/html myos:nginx
# 访问验证
[root@docker ~]# curl http://192.168.88.31/info.php
容器网络通信
共享名称空间
# 使用 nginx 的网络名称空间
[root@docker ~]# docker run -itd --rm --name php --network=container:web myos:php-fpm
[root@docker ~]# curl http://192.168.88.31/info.php
[root@docker ~]# docker exec -it web ss -ltun
# 为 php 增加数据卷
[root@docker ~]# docker rm -f php
[root@docker ~]# docker run -itd --rm --name php --network=container:web \
-v /var/webroot:/usr/local/nginx/html myos:php-fpm
[root@docker ~]# curl http://192.168.88.31/info.php
服务编排与治理
项目文件
# 创建项目文件
[root@docker ~]# vim docker-compose.yaml
name: myweb
version: "3"
services:
websvc:
container_name: nginx
image: myos:nginx
项目管理命令
指令 | 说明 |
up | 创建项目并启动容器 |
ls | 列出可以管理的项目 |
images | 列出项目使用的镜像 |
ps | 显示项目中容器的状态 |
logs | 查看下项目中容器的日志 |
start/stop/restart | 启动项目/停止项目/重启项目 |
down | 删除项目容器及网络 |
容器目管理
# 创建项目,并启动
[root@docker ~]# docker compose -f docker-compose.yaml up -d
# 查看项目
[root@docker ~]# docker compose ls -a
# 查看项目中的容器状态
[root@docker ~]# docker compose -p myweb ps
# 查看项目使用的镜像
[root@docker ~]# docker compose -p myweb images
# 查看项目中容器的日志
[root@docker ~]# docker compose -p myweb logs
# 启动、停止、重启项目
[root@docker ~]# docker compose -p myweb stop
[root@docker ~]# docker compose -p myweb start
[root@docker ~]# docker compose -p myweb restart
# 删除项目
[root@docker ~]# docker compose -p myweb down
compose 语法
指令 | 说明 |
container_name | 指定容器名称 |
image | 指定为镜像名称或镜像 ID |
ports | 暴露端口信息 |
volumes | 数据卷,支持 [volume、bind、tmpfs、npipe] |
network_mode | 设置网络模式 |
environment | 设置环境变量 |
restart | 容器保护策略[always、no、on-failure] |
command | 覆盖容器启动后默认执行的命令 |
healthcheck | 配置服务健康检测 |
depends_on | 服务依赖关系 services_[started、healthy、completed_successfully] |
容器服务编排
[root@docker ~]# vim docker-compose.yaml
name: myweb
version: "3"
services:
websvc:
container_name: nginx
image: myos:nginx
ports:
- 80:80
environment:
- "TZ=Asia/Shanghai"
volumes:
- type: bind
source: /root/conf/nginx.conf
target: /usr/local/nginx/conf/nginx.conf
- type: bind
source: /var/webroot
target: /usr/local/nginx/html
phpsvc:
container_name: php
image: myos:php-fpm
restart: always
network_mode: "service:websvc"
volumes:
- type: bind
source: /var/webroot
target: /usr/local/nginx/html
验证项目
# 创建,并启动项目
[root@docker ~]# docker rm -f $(docker ps -aq)
[root@docker ~]# docker compose -f docker-compose.yaml up -d
# 查看项目
[root@docker ~]# docker compose ls -a
# 查看容器状态,验证服务
[root@docker ~]# docker compose -p myweb ps
# 访问 php 页面验证
[root@docker ~]# curl -s http://127.0.0.1/info.php
嵌入式脚本
# 拓展提高
[root@docker ~]# vim mysvc.yaml
name: mysvc
version: "3"
services:
initsvc:
container_name: init
image: myos:8.5
command:
- sh
- -c
- |
for i in {1..9}
do
sleep 1
echo "${HOSTNAME} && $${HOSTNAME}"
done
svc1:
container_name: myphp
image: myos:php-fpm
healthcheck: # 定义健康检查
test: # 健康检查指令
- CMD-SHELL # CMD 定义单一命令,CMD-SHELL 嵌入脚本
- sh
- -c
- |
ID=$${RANDOM}
sleep 5
exit $$((ID%2))
interval: 30s # 健康检查的间隔时间
timeout: 10s # 健康检查的超时时间
retries: 3 # 健康检查的重试次数
start_period: 10s # 容器启动后延时检查时间
depends_on:
initsvc:
condition: service_completed_successfully
svc2:
container_name: myweb
image: myos:httpd
depends_on:
svc1:
condition: service_healthy
[root@docker ~]# docker compose -f mysvc.yaml up -d
[root@docker ~]# docker compose -p mysvc ls -a
[root@docker ~]# docker compose -p mysvc logs
harbor 仓库
主机名 | ip地址 | 最低配置 |
harbor | 192.168.88.240 | 2CPU,4G内存 |
安装部署
部署 docker
# 配置修改主机名
[root@pubserver ~]# hostnamectl set-hostname harbor
[root@pubserver ~]# vim /etc/hosts
192.168.88.240 harbor
# 卸载 Podman 和 docker-distribution
[root@pubserver ~]# dnf remove -y podman docker-distribution
[root@pubserver ~]# reboot
重新登陆
[root@harbor ~]# vim /etc/yum.repos.d/docker.repo
[Docker]
name=Rocky Linux $releasever - Docker Packages
baseurl="ftp://192.168.88.240/rpms"
enabled=1
gpgcheck=0
# 安装部署 docker
[root@harbor ~]# dnf install -y docker-ce
[root@harbor ~]# systemctl enable --now docker
- 拷贝软件包到 harbor 主机
[root@server s4]# rsync -av public/harbor-* 192.168.88.240:/root/
创建证书
# 导入 harbor 项目镜像
[root@harbor ~]# tar -zxf harbor-v2.9.2.tgz -C /usr/local/
[root@harbor ~]# cd /usr/local/harbor
[root@harbor harbor]# docker load -i harbor.v2.9.2.tar.gz
# 创建 https 证书
[root@harbor harbor]# mkdir tls
[root@harbor harbor]# openssl genrsa -out tls/cert.key 2048
[root@harbor harbor]# openssl req -new -x509 -days 3652 -key tls/cert.key -out tls/cert.crt \
-subj "/C=CN/ST=BJ/L=BJ/O=Tedu/OU=NSD/CN=harbor" \
-addext "subjectAltName = IP:192.168.88.240"
启动项目
# 修改配置文件
[root@harbor harbor]# cp harbor.yml.tmpl harbor.yml
[root@harbor harbor]# vim harbor.yml
05: hostname: 192.168.88.240
08: # http:
10: # port: 80
17: certificate: /usr/local/harbor/tls/cert.crt
18: private_key: /usr/local/harbor/tls/cert.key
36: harbor_admin_password: <登录密码>
# 预安装环境检查,生成项目文件
[root@harbor harbor]# /usr/local/harbor/prepare
# 创建并启动项目
[root@harbor harbor]# docker compose -f docker-compose.yml up -d
# 添加开机自启动
[root@harbor harbor]# chmod 0755 /etc/rc.d/rc.local
[root@harbor harbor]# echo "/usr/bin/docker compose -p harbor start" >>/etc/rc.d/rc.local
- 查看验证项目
# 查看项目
[root@harbor ~]# docker compose ls -a
NAME STATUS CONFIG FILES
harbor running(9) /usr/local/harbor/docker-compose.yml
# 查看容器状态
[root@harbor ~]# docker compose -p harbor ps
- 通过浏览器配置管理 harbor 服务
harbor 管理
容器管理命令 | 说明 |
docker login | 登录私有镜像仓库 |
docker logout | 退出登录 |
登录私有仓库
# 添加主机配置
[root@docker ~]# vim /etc/hosts
192.168.88.240 harbor
# 添加私有仓库配置
[root@docker ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://harbor:443", "其他镜像仓库"],
"insecure-registries":["harbor:443", "其他镜像仓库"]
}
[root@docker ~]# systemctl restart docker
# 登录 harbor 仓库
[root@docker ~]# docker login harbor:443
Username: <登录用户>
Password: <登录密码>
# 认证信息记录文件
[root@docker ~]# cat /root/.docker/config.json
{
"auths": { ... ... }
}
# 退出登录
[root@docker ~]# docker logout harbor:443
Removing login credentials for harbor:443
上传镜像
# 设置标签
[root@docker ~]# docker tag myos:httpd harbor:443/private/httpd:latest
# 没有登录上传失败
[root@docker ~]# docker push harbor:443/private/httpd:latest
# 登录成功后才可以上传
[root@docker ~]# docker login harbor:443
Username: <登录用户>
Password: <登录密码>
# 上传成功
[root@docker ~]# docker push harbor:443/private/httpd:latest
# 上传镜像到 library 项目
[root@docker ~]# docker tag myos:latest harbor:443/library/myos:latest
# 没有权限上传失败
[root@docker ~]# docker push harbor:443/library/myos:latest
# 赋权后重新上传镜像
[root@docker ~]# docker push harbor:443/library/myos:latest