1.使用使用docker-compose编排容器
1.YAML ⽂件的格式和语法
1)YAML ⽂件格式
yaml 是⼀种标记语⾔很直观的数据序列化格式,可读性很⾼。 类似于 xml 描述性语⾔,语法⽐xml简单的很多。
yaml 数据结构通过缩进进⾏表示,连续的项⽬通过减号来表示,键值对⽤冒号分隔,数组⽤中括号括起来,hash⽤花括号括起来。
yaml ⽂件的基本格式由⼀系列键值对构成。每个键值对都⽤冒号“: ”分隔
key: value
在 yaml 中,键和值之间只需要⼀个空格,这是为了保证 yaml ⽂件的可读性和⼀致性
对于字符串值,可以使⽤单引号或者双引号将其括起来,这样可以避免出现特殊字符或空格等问题
name: 'Meng Mr' age: "34"
如果值包含特殊字符(如冒号或短横线),则应该使⽤引号将其括起来
description: "This is a YAML file: good for configuation files."
2)YAML 注意事项
不⽀持制表符 tab 键缩进,需要使⽤空格缩进。
通常开头缩进 2 个空格。
字符后缩进 1 个空格,如:冒号,逗号,横杠。
⽤ # 表示注释。
如果包含特殊字符⽤单引号引起来。
布尔值(true、false、yes、no、on、off)必须使⽤“”引号括起来,这样分析器会将它们解释为字符串。
3)列表和数组在yaml中,可以使⽤“-”符号表示⼀个列表和数组
fruits: # fruits是⼀个键,它对应⼀个列表,包含三个元素:apple、banana、orange apple # fruits为⼀个⼤项,下⾯的⼩项只需要缩进⼏个空格,与其他项⽬对⻬即可 banana orange
4)嵌套数据结构yaml⽀持嵌套数据结构,可以⽤缩进来表示不同层级之间的关系, 可使⽤ # 号表示注释信息。
person: name: 'Meng Mr' # 两个空格,name和age是person的⼀级⼦节点 age: "34" address: # address是person的⼆级⼦节点 street: '123 Main St' # address节点包含了street、city、state和zip四个⼀级⼦节点 city: 'Anytown' state: 'CA' zip: '12345'
5)Docker-compose 安装使用pip工具-------安装docker-compose
pip是python的包管理工具,和yum是redhat的关系是一样的
由于要使用python环境运行docker-compose,所以需要验证python
[root@docker1 ~]# python --version Python 2.7.5 #安装pip,python的包管理工具(需要使用pip下载安装docker-compose) [root@docker1 ~]# yum -y install python2-pip #查看所有已经安装过的python第三方库,发现pip版本太低 [root@docker1 ~]# pip list pip (8.1.2) #升级pip版本 [root@docker1 ~]# pip install --upgrade pip
安装失败
[root@docker1 ~]# pip install --upgrade pip==20.3 -i https://mirrors.aliyun.com/pypi/simple Successfully installed pip-20.3 [root@docker1 ~]# pip list pip 20.3 #使用pip安装docker-compose [root@docker1 ~]# pip install docker-compose --ignore-installed requests -i https://mirrors.aliyun.com/pypi/simple [root@docker1 ~]# pip list docker-compose 1.26.2
配置docker
[root@docker1 ~]# sh docker.sh [root@docker1 ~]# docker --version Docker version 26.1.4, build 5650f9b
6)docker-compose 命令解析
1、⽂件内常⽤指令字段
(1)version
指定了Docker compose编排⽂件的版本 Docker Compose ⽬前有三个版本,分别为 Version1、 Version2和Version3。
Version1 是较早的版本,它将来会被弃⽤。
Version2 是⽬前的稳定版本,⽀持更多的指令。
Version3 在功能上与 Version2 类似,但进⾏了⼀些改进和 扩展,例如增加了对 Docker BuildKit 的⽀持,可以加速构建过程。
version:'3'
(2)service指定了在 docker compose 编排中要运⾏的服务,每个服务都有⼀ 个名称,并指定要使⽤的镜像和容器的配置选项。
services: mysql: #服务名
再往下可以对该服务进⾏定义,⽐如指定映射端⼝,指定使⽤的镜像等,但要注意缩进格式。
(3)image指定要使用的docker镜像
services: mysql: # 服务名 image: mysql:5.5 # 指定mysql镜像,如果主机内不存在该镜像,会从登录的docker镜像仓库内拉取,⼀般都是从dockerhub上拉取
(4)build允许在 docker compose 编排中指定 dockerfile 的位置。
services: mysql: # 服务名 build: /docker/mysql # 这⾥为⽤户微服务⽂件夹,⾥⾯存放的是该服务代码jar包和Dockerfile⽂件
(5)environment指定了要设置的环境变量。
services: mysql: # 服务名 environment: # 下⾯是MySQL环境变量的例⼦ MYSQL_ROOT_PASSWORD: 000000 # 设置MySQL的root⽤户的密码 MYSQL_DATABASE: database # 指定要创建的数据库名称 MYSQL_USER: user # 指定要创建的MySQL⽤户名 MYSQL_PASSWORD: 123 # 指定要创建的MySQL⽤户的密码
(6)volumes挂载宿主机路径或命名卷
1、指定路径挂载
services: mysql: # 服务名 volumes: - ./mysql/data:/var/lib/mysq # 直接指定路径挂载
2、⽣成 volume 卷挂载
[root@doc ~]# docker volume create mysql # ⽣成名为mysql的volume卷 [root@doc ~]# vim docker-compose.yml services: mysql: # 服务名 volumes: - mysql:/var/lib/mysq # 指定volume卷挂载
3、共享⽬录挂载
[root@doc ~]# vim docker-compose.yml version: '2' # 使⽤共享⽬录挂载只有‘2’版本⽀持 service: mysql: # 服务名 volumes: - /var/lib/mysql # 将这个⽬录作为共享⽬录 nginx: volumes: - /usr/local/nginx/html php: volumes_from: # 共享⽬录来⾃ - mysql # 挂载的共享⽬录,挂载后会在容器内⽣成与被挂载的⽬录同名的路径 - nginx # 共享挂载可以是⼀个列表
(7)port
指定了要宿主机映射到容器的端⼝,端⼝不能低于 60(宿主机端 ⼝:容器端⼝),如果选择的端⼝号低于 60,可能会与系统保留的知名端⼝冲突。
services: mysql: # 服务名 ports: - 3306:3306 # 宿主机端⼝:容器端⼝
(8)expose⽤于在 docker 容器内部暴露端⼝的选项。
services: mysql: # 服务名 expose: - 3306
(9)networks加⼊⽹络,引⽤顶级 networks 条⽬.
networks: # 与services同级 dev: # ⾃定义或已存在的⽹络设备名 driver: bridge # 设备类型:⽹桥 external: true # 外部存在:是
(10)hostname设定容器主机名
services: mysql: # 服务名 hostname: mysql
(11)command指定容器启动时要运⾏的命令,覆盖构建时的默认命令
services: mysql: #服务名 command: --character-set·server=utf8
2、docker compose 命令选项
(1)build:重新构建服务(2) ps:列出容器(3) up:启动所有docker-compose服务(4) up -d:启动所有docker-compose服务启动并后台运⾏(5) exec:进⼊容器实例内部(6)scale:指定⼀个服务器启动数量(7)top:显示容器进程(8)logs:查看容器输出⽇志(9)down:停⽌并删除容器、⽹络、卷、镜像(10)stop:停⽌服务(11) start:启动服务(12) restart:重启服务(13)config:检查配置(14)config -q:检查配置,有问题才有输出(15) --version:查看版本
3.docker-compose 实例
# 准备docker环境 [root@docker03 ~]# vim /etc/docker/daemon.json "insecure-registries" : [ "http://10.0.0.52" ], [root@docker03 test]# vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd [root@docker03 test]# systemctl daemon-reload [root@docker03 test]# systemctl start docker [root@docker03 ~]# mkdir test [root@docker03 ~]# cd test # 创建docker-compose实例 [root@docker03 test]# mkdir html [root@docker03 test]# echo "我是被编排的nginx" > ./html/index.html [root@docker03 test]# ls docker-compose.yml html [root@docker03 test]# vim docker-compose.yml version: "3" #⽂件版本 services: nginx: #服务名 container_name: c1 #容器名 image: "nginx:latest" ports: - "80:80" #端⼝映射 volumes: - /root/test/html/:/usr/share/nginx/html/ #挂载 # 启动compose集群 # 要在 docker-compose.yml ⽂件所在的⽬录下才能通过 docker compose 命令启动容器。 [root@docker03 test]# docker compose up -d # 启动⼯程后会根据指定的容器名称,⽣成对应的容器 WARN[0000] /root/test/docker-compose.yml: `version` is obsolete [+] Running 8/8 ✔ nginx Pulled 30.4s ✔ e4fff0779e6d Pull complete 9.5s ✔ 2a0cb278fd9f Pull complete 19.8s ✔ 7045d6c32ae2 Pull complete 19.8s ✔ 03de31afb035 Pull complete 19.8s ✔ 0f17be8dcff2 Pull complete 19.9s ✔ 14b7e5e8f394 Pull complete 19.9s ✔ 23fa5a7b99a6 Pull complete 19.9s [+] Running 2/2 ✔ Network test_default Created 0.3s ✔ Container c1 Started 0.8s # 访问测试 [root@docker03 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 5ef79149e0ec 2 weeks ago 188MB [root@docker03 test]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 46d8b91c4a5e nginx:latest "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp c1 [root@docker03 test]# curl 10.0.0.52 我是被编排的nginx # 浏览器访问
2.habor配置
Harbor 是一个用于存储和管理 Docker 镜像等容器镜像的企业级 Registry 服务器 。
1、上传harbor文件,解压
[root@docker ~]# yum -y install python2-pip [root@docker ~]# pip list pip (8.1.2) [root@docker ~]# pip install --upgrade pip==20.3 -i https://mirrors.aliyun.com/pypi/simple [root@docker ~]# pip list docker-compose 1.26.2 [root@docker01 ~]# tar -zxvf harbor-offline-installer-v2.11.1.tgz [root@docker01 ~]# cd harbor [root@docker01 harbor]# ls common.sh harbor.v2.11.1.tar.gz harbor.yml.tmpl install.sh LICENSE prepare
2、修改配置文件
[root@docker01 harbor]# cp harbor.yml.tmpl harbor.[root@docker01 harbor]# vim harbor.yml hostname: 192.168.1.55 #第5行 #https下都注释 #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 # enable strong ssl ciphers (default: false) # strong_ssl_ciphers: false
3、部署容器环境
# 修改daemon.json文件 [root@docker1 harbor]# vim /etc/docker/daemon.json { "registry-mirrors" : [ "https://do.nark.eu.org", "https://dc.j8.work", "https://docker.m.daocloud.io", "https://dockerproxy.com", "https://docker.mirrors.ustc.edu.cn", "https://docker.nju.edu.cn" ], "host" : [ "tcp://0.0.0.0:2375", "unix:///var/run/docker.sock" ], "insecure-registries" : [ # 本机ip地址(仓库),使用80端口 "http://10.0.0.51" ], "bip" : "172.20.13.1/24", "mtu" : 1472 } # 开启容器 [root@docker1 harbor]# systemctl start docker # 修改docker文件 [root@docker1 harbor]# vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd # 重新加载daemon文件 [root@docker1 harbor]# systemctl daemon-reload # 重启docker [root@docker1 harbor]# systemctl restart docker
4、使用自带脚本检查并初始化配置harbor
# 检查环境是否合适 [root@docker1 harbor]# ./prepare prepare base dir is set to /root/harbor Unable to find image 'goharbor/prepare:v2.11.1' locally Successfully called func: create_root_cert # 查看端口是否被占用并关闭防火墙 [root@docker1 harbor]# netstat -lntup | grep 5000 [root@docker1 harbor]# netstat -lntup | grep 80 [root@docker1 harbor]# systemctl stop firewalld # 开始初始化配置harbor环境 [root@docker1 harbor]# ./install.sh
5、查看容器运行情况
# 查看被创建的容器,都是正在开启的状态,等一会让他全部开启 [root@docker1 harbor]# docker ps -a
6、测试
到浏览器中访问本机ip地址
输入(用户名:admin 密码:Harbor12345)
7、推送镜像到harbor的私有仓库中
[root@docker01 harbor]# docker login http://192.168.1.55 Username: admin Password: Harbor12345 [root@docker01 harbor]# docker tag centos:latest 192.168.1.55/centos:latest #为镜像打标签 [root@docker01 harbor]# docker push 192.168.1.55/library/yjjcentos:v0 #将本地镜像推送到私有库中
8、harbor配置中使用到的docker-compose命令
[root@docker1 ~]# ls anaconda-ks.cfg docker.sh harbor harbor-offline-installer-v2.11.1.tgz v [root@docker1 ~]# cd harbor [root@docker1 harbor]# ls common docker-compose.yml harbor.yml install.sh prepare common.sh harbor.v2.11.1.tar.gz harbor.yml.tmpl LICENSE # 一次性关闭所有容器 [root@docker1 harbor]# docker-compose stop # 开启所有容器 [root@docker1 harbor]# docker-compose start # 删掉所有容器 [root@docker1 harbor]# docker-compose down # 重新检查环境 [root@docker1 harbor]# ./prepare # 重新初始化 [root@docker1 harbor]# ./install.sh