Docker自学文档
学前零星使用操作
一、基础镜像篇
二、基础容器篇
三、容器数据卷
四、DockerFile构建镜像
五、网络篇
六、Docker Compose
docker 在已经启动的容器中开启端口映射
ubuntu22.04使用docker-compose部署最美博客系统
本文档使用 MrDoc 发布
-
+
home page
六、Docker Compose
## 1.基础理论 当在宿主机启动较多的容器时候,如果都是手动操作会觉得比较麻烦而且容易出错,此时推荐使用docker 单机编排工具 docker-compose。 docker-compose 是 docker 容器的一种单机编排服务,docker-compose 是一个管理多个容器的工具,比如:可以解决容器之间的依赖关系,就像启动一个nginx 前端服务的时候会调用后端的tomcat,那就得先启动tomcat,但是启动tomcat 容器还需要依赖数据库,那就还得先启动数据库,docker-compose 可以用来解决这样的嵌套依赖关系,并且可以替代docker命令对容器进行创建、启动和停止等手工的操作。 因此,如果说docker命令就像linux的命令,docker compse就像shell脚本,可以自动的执行容器批量操作,从而实现自动化的容器管理,或者说docker命令相当于ansible命令,那么docker compose文件,就相当于ansible-playbook的yaml文件。 docker-compose 项目是Docker 官方的开源项目,负责实现对Docker 容器集群的快速编排,docker-compose 将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。 Docker Compose 使用 YAML 文件来定义多服务的应用。YAML 是 JSON 的一个子集,因此也可以使用JSON。Docker Compose 默认使用文件名compose.yml,同时也支持docker-compose.yml。当然,也可以使用 -f 参数指定具体文件。 ### 1.1.选项参数说明 > \#选项说明: > > -f,–file FILE #指定Compose 模板文件,默认为docker-compose.yml。 > > -p,–project-name NAME #指定项目名称,默认将使用当前所在目录名称作为项目名。 > > --verbose #显示更多输出信息 > > --log-level LEVEL #定义日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL) > > --no-ansi #不显示ANSI 控制字符 > > -v, --version #显示版本 > > > > #以下为命令选项,需要在docker-compose.yml|yaml 文件所在在目录里执行 > > build #构建镜像 > > bundle #从当前docker compose 文件生成一个以<当前目录>为名称的json格式的Docker > > Bundle 备份文件 config -q #查看当前配置,没有错误不输出任何信息 > > create #创建服务,较少使用 > > down #停止和删除所有容器、网络、镜像和卷 > > #events #从容器接收实时事件,可以指定json 日志格式,较少使用 > > exec #进入指定容器进行操作 > > help #显示帮助细信息 > > images #显示镜像信息,较少使用 > > kill #强制终止运行中的容器 > > logs #查看容器的日志 > > pause #暂停服务 > > port #查看端口 > > ps #列出容器,较少使用 > > pull #重新拉取镜像,镜像发生变化后,需要重新拉取镜像,较少使用 > > push #上传镜像 > > restart #重启服务,较少使用 > > rm #删除已经停止的服务 > > run #一次性运行容器 > > scale #设置指定服务运行的容器个数 > > start #启动服务 ,较少使用 > > stop #停止服务,较少使用 > > top #显示容器运行状态 > > unpause #取消暂定 > > up #创建并启动容器 ,较少使用 ### 1.2.常用命令 ```shell docker-compose up:启动所有服务。 docker-compose up :启动指定的服务。 docker-compose down:停止并删除所有服务。 docker-compose down :停止并删除指定的服务。 docker-compose ps:列出所有正在运行的服务。 docker-compose logs:查看所有服务的日志。 ``` ### 1.3.docker-compose模本文件解析 | 字段 | 描述 | | :------------- | :----------------------------------------------------------- | | build | 使用Dockerfile构建镜像。指定Dockerfile 文件名,要指定Dockerfile文件需要在bui ld标签的子级标签中使用dockerfile标签指定 | | dockerfile | 构建镜像上下文路径(指定Dockerfile文件) | | context | 可以是dockerfile 的路径,或者是指向git 仓库的url地址 | | image | 指定镜像 | | command | 执行命令,覆盖容器启动后默认执行的命令(类似于 docker run) | | container_name | 指定容器名称,由于容器名称是唯一的, 如果指定自定义名称,则无法scale指定容器数量(同一个镜像指定多个容器数量) | | deploy | 指定部署和运行服务相关的配置,只能在Swarm模式使用 | | environment | 添加环境变量 | | networks | 加入网络,引用顶级networks下条目 | | networks_mode | 设置容器的网络模式,如 host,bridge | | ports | 暴露容器端口,与-p相同,但端口不能低于60 | | volumes | 挂载一个宿主机目录或命令卷到容器中,命令卷要在顶级volumes定义卷名称 | | volumes_from | 从另一个服务或容器挂载卷,可选参数:ro 和:rw。仅版本'2' 支持 | | hostname | 容器主机名 | | sysctls | 在容器内设置内核参数 | | links | 连接到另外一个容器,- 服务名称[:服务别名] (类似于容器互联) | | privileged | 用来给容器root权限,注意是不安全的,只有两个值:true或false | | restart | 设置重启策略,never,always, no-failure, unless-stopped | | | never,默认策略,在容器退出时不重启容器。 | | | on-failure,在容器非正常退出时(退出状态非0),才会重启容器。 | | | on-failure:3,在容器非正常退出时重启容器,最多重启3次。 | | | always,在容器退出时总是重启容器。 | | | unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器。 | | depends_on | 在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,可能会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题。 | #### 1.3.1.version `version` 字段指定了 Docker Compose 编排文件的版本,例如: ```shell version: '3' ``` #### 1.3.2 services `services` 字段指定了在 Docker Compose 编排中要运行的服务。每个服务都有一个名称,并指定要使用的镜像和容器的配置选项。例如: ```shell services: mysql: #服务名 image: mysql:5.5 #mysql镜像 ``` #### **1.3.3 build 和 image** `build` 字段允许在 Docker Compose 编排中指定 Dockerfile 的位置,从而可以使用 Docker Compose 构建镜像。`image` 字段指定要使用的 Docker 镜像。例如: ```shell services: mysql: #服务名 image: mysql:5.5 #mysql镜像 user: #服务名 build: ./user #这里为用户微服务文件夹,里面存放的是该服务代码jar包和Dockerfile文件 ``` #### 1.3.4 volumes 和 environment `volumes` 字段指定了要使用的数据卷。`environment` 字段指定了要设置的环境变量。例如: ```shell services: mysql: #服务名 image: mysql:5.5 #mysql镜像 environment: MYSQL_ROOT_PASSWORD: 000000 #设置数据库密码 volumes: - "$PWD/mysql/data:/var/lib/mysql" #数据卷挂载 ``` #### **1.3.5 ports 和 expose** `ports`字段指定了要宿主机映射到容器的端口(宿主机端口:容器端口)。`expose` 字段是用于在 Docker 容器内部暴露端口的选项,可以让其他容器连接到这些端口,但不会将它们映射到 Docker 主机上。`expose` 与 `ports` 不同的是,`expose` 字段仅仅是将容器内部的端口暴露给其他容器使用,而不是直接映射到宿主机上的端口 例如: ```shell services: gateway: #服务名 build: ./gateway #这里为网关文件夹,里面存放的是该服务代码jar包和Dockerfile文件 ports: -"7000:7000" nginx: image: nginx expose: -"8080" ``` #### 1.3.6.ulimits 指定容器的 `ulimits` 限制值。例如,指定最大进程数为 65535,指定文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制) 和 40000(系统硬限制,只能 root 用户提高)。 ```shell ulimits: nproc:65535 nofile: soft:20000 hard:40000 ``` #### 1.3.7.depends_on 解决容器的依赖、启动先后的问题。以下例子中会先启动 redis mysql 再启动 web ```shell version:'3' services: web: build:. depends_on: -db -redis redis: image:redis db: image:mysql ``` #### 1.3.8.environment 设置环境变量。你可以使用数组或字典两种格式。 ```shell environment: SW_STORAGE:elasticsearch SW_STORAGE_ES_CLUSTER_NODES:elasticsearch:9200 environment: -SW_STORAGE=elasticsearch -SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 ``` #### 1.3.9.restart 指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 `always` 或者 `unless-stopped`。 ```shell restart: always ``` #### 1.3.10.networks `networks`应用的网络,在它下面可以定义应用的名字、使用的网络类型等。 ```shell networks: halo_network: ``` #### 1.3.11.healthcheck `healthcheck`配置运行的检查以确定此服务的容器是否“健康”。 ```shell healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 1m30s timeout: 10s retries: 3 start_period: 40s ``` #### 1.3.12.command `command`重写默认的命令,即指定启动容器的命令。 ```shell command: - --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo - --spring.r2dbc.username=halo # PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。 - --spring.r2dbc.password=openpostgresql - --spring.sql.init.platform=postgresql # 外部访问地址,请根据实际需要修改 - --halo.external-url=http://localhost:8090/ # 初始化的超级管理员用户名 - --halo.security.initializer.superadminusername=admin # 初始化的超级管理员密码 - --halo.security.initializer.superadminpassword=P@88w0rd ``` ## 2.docker-compose安装 > docker-compose安装很简单,下载对应文件,添加执行权限即完成安装,不需要依赖docker引擎 2.1.下载最新Docker-compose文件 ```shell curl -SL https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose ``` 2.2.添加可执行权限,即完成安装 ```shell [root@localhost ~]# chmod +x /usr/local/bin/docker-compose ``` 2.3.查看版本信息 ````shell [root@localhost ~]# docker-compose -v Docker Compose version v2.20.3 ```` ## 3.使用docker-compose批量部署nginx服务 > 部署3个nginx服务,并实现端口映射,容器卷挂载服务等 ### 3.1.提前拉去好实验镜像(本次是自己制作的镜像,版本1.25.1),并准备好对应的nginx配置文件 ### 3.2.编写docker-compose.yaml文件 ``` version: "3" networks: mynet110: driver: bridge ipam: config: - subnet: 172.18.0.0/16 services: nginx01: image: cs/nginx:latest container_name: nginx01 restart: always networks: mynet110: ipv4_address: 172.18.0.2 volumes: - /usr/local/nginx01/html:/usr/local/nginx/html - /usr/local/nginx01/conf.d:/usr/local/nginx/conf.d - /usr/local/nginx01/logs:/usr/local/nginx/logs - /usr/local/nginx01/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf ports: - "80:80" nginx02: image: cs/nginx:latest container_name: nginx02 restart: always networks: mynet110: ipv4_address: 172.18.0.3 volumes: - /usr/local/nginx02/html:/usr/local/nginx/html - /usr/local/nginx02/conf.d:/usr/local/nginx/conf.d - /usr/local/nginx02/logs:/usr/local/nginx/logs - /usr/local/nginx02/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf ports: - "81:80" nginx03: image: cs/nginx:latest container_name: nginx03 restart: always networks: mynet110: ipv4_address: 172.18.0.4 volumes: - /usr/local/nginx03/html:/usr/local/nginx/html - /usr/local/nginx03/conf.d:/usr/local/nginx/conf.d - /usr/local/nginx03/logs:/usr/local/nginx/logs - /usr/local/nginx03/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf ports: - "82:80" ``` ### 3.3.检查语法错误 ``` [root@localhost nginx]# docker-compose config -q ``` ### 3.4.启动服务并查看容器 ``` [root@localhost nginx]# docker-compose up -d [+] Running 3/3 ✔ Container nginx03 Started 0.6s ✔ Container nginx01 Started 0.6s ✔ Container nginx02 Started 0.6s [root@localhost nginx]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f26352c93337 cs/nginx:latest "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, :::80->80/tcp nginx01 02d1d0cd7827 cs/nginx:latest "nginx -g 'daemon of…" About a minute ago Up About a minute 80/tcp, 0.0.0.0:81->81/tcp, :::81->81/tcp nginx02 8ec762adabe0 cs/nginx:latest "nginx -g 'daemon of…" About a minute ago Up About a minute 80/tcp, 0.0.0.0:82->82/tcp, :::82->82/tcp nginx03 ``` ### 3.5.放入首页测试文件,并测试 ``` [root@localhost nginx]# touch this is nginx01 web site > /usr/local/nginx01/html/index.html [root@localhost nginx]# touch this is nginx02 web site > /usr/local/nginx02/html/index.html [root@localhost nginx]# touch this is nginx03 web site > /usr/local/nginx03/html/index.html ``` ![](/media/202309/image-20230821170035779.png) ![](/media/202309/image-20230821170051562.png) ![](/media/202309/image-20230821170104266.png) ## 4.使用docker-compose批量部署mysql服务 > #使用docker-compose部署mysql项目,mysql版本为5.7 ### 4.1.编写docker-compose.yaml文件 ```shell version: "3" networks: mynet110: driver: bridge ipam: config: - subnet: 172.18.0.0/16 services: mysql01: image: mysql:5.7 container_name: mysql01 restart: always networks: mynet110: ipv4_address: 172.18.0.2 volumes: - /home/mysql01/conf:/etc/mysql/conf.d - /home/mysql01/data:/var/lib/mysql ports: - "3306:3306" environment: - MYSQL_ROOT_PASSWORD=0000 command: --max_connections=1000 # 最大连接数 --character-set-server=utf8mb4 # 字符编码 --collation-server=utf8mb4_general_ci # 在比较和排序的时候更快 --default-authentication-plugin=mysql_native_password # 身份验证插件 mysql02: image: mysql:5.7 container_name: mysql02 restart: always networks: mynet110: ipv4_address: 172.18.0.3 volumes: - /home/mysql02/conf:/etc/mysql/conf.d - /home/mysql02/data:/var/lib/mysql ports: - "3307:3306" environment: - MYSQL_ROOT_PASSWORD=0000 command: --max_connections=1000 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --default-authentication-plugin=mysql_native_password mysql03: image: mysql:5.7 container_name: mysql03 restart: always networks: mynet110: ipv4_address: 172.18.0.4 volumes: - /home/mysql03/conf:/etc/mysql/conf.d - /home/mysql03/data:/var/lib/mysql ports: - "3308:3306" environment: - MYSQL_ROOT_PASSWORD=0000 command: --max_connections=1000 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --default-authentication-plugin=mysql_native_password ``` ### 4.2.语法没有错误后启动容器服务 ``` [root@localhost mysql]# docker-compose config -q [root@localhost mysql]# docker-compose up -d [+] Running 4/4 ✔ Network mysql_mynet110 Created 0.2s ✔ Container mysql03 Started 0.0s ✔ Container mysql01 Started 0.0s ✔ Container mysql02 Started 0.0s ``` ### 4.3.查看运行的容器 ``` [root@localhost mysql]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ee1c2ae06a3c mysql:5.7 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql01 834040baeb6e mysql:5.7 "docker-entrypoint.s…" About a minute ago Up About a minute 33060/tcp, 0.0.0.0:3308->3306/tcp, :::3308->3306/tcp mysql03 ea87d1ff63fd mysql:5.7 "docker-entrypoint.s…" About a minute ago Up About a minute 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp mysql02 ``` ### 4.5.测试访问 ![](/media/202309/image-20230822160500679.png) ![](/media/202309/image-20230822160520687.png) ![](/media/202309/image-20230822160537089.png) ![](/media/202309/image-20230822160645955.png) ## 5.使用docker-compose部署lnmp环境 > 基于官方镜像配置lnmp环境 > > nginx 1.25.1、mysql 5.7、php 7.6 ### 5.1.编写docker-compose文件 ``` version: "3" networks: mynet110: driver: bridge ipam: config: - subnet: 172.18.0.0/16 services: php: image: php:latest container_name: php restart: always volumes: - /www/wwwroot/cs.com:/var/www networks: mynet110: ipv4_address: 172.18.0.2 ports: - "9000:9000" nginx: image: cs/nginx:latest container_name: nginx restart: always networks: mynet110: ipv4_address: 172.18.0.3 volumes: - /www/wwwroot/cs.com:/usr/local/nginx/html - /www/nginx/conf.d:/usr/local/nginx/conf.d - /www/nginx/logs:/usr/local/nginx/logs - /www/nginx/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf ports: - "80:80" mysql: image: mysql:5.7 container_name: mysql restart: always networks: mynet110: ipv4_address: 172.18.0.4 volumes: - /www/mysql/conf:/etc/mysql/conf.d - /www/mysql/data:/var/lib/mysql ports: - "3307:3306" environment: - MYSQL_ROOT_PASSWORD=0000 command: --max_connections=1000 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --default-authentication-plugin=mysql_native_password ``` ### 5.2.语法没有错误后启动容器服务 ``` [root@localhost lnmp]# docker-compose up -d [+] Running 10/10 ✔ fpm 9 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 48.6s ✔ a2abf6c4d29d Pull complete 9.9s ✔ c5608244554d Pull complete 0.4s ✔ 2d07066487a0 Pull complete 1.0s ✔ 40f5e6ee20ce Pull complete 8.7s ✔ 718b027f9905 Pull complete 9.1s ✔ 3bf01f3e893c Pull complete 19.3s ✔ af85a153f85f Pull complete 10.5s ✔ e052a88c20f6 Pull complete 11.3s [+] Running 4/4 ✔ Network lnmp_mynet110 Created 0.2s ✔ Container mysql Started 0.5s ✔ Container fpm Started 0.5s ✔ Container nginx Started 0.5s [root@localhost lnmp]# ``` 5.3.查看容器运行情况 ``` ``` ## 6.使用docker-compose部署redis服务 ## 7.使用docker-compose构建halo项目 > ### 3.1.任意位置创建halo目录 ```shell [root@localhost ~]# mkdir ~/halo && cd ~/halo ``` ### 3.2.创建 `docker-compose.yaml`文件 ```shell #采用halo+mysql方式 [root@localhost halo]# vim docker-compose.yaml version: "3" services: halo: image: halohub/halo:2.8 container_name: halo restart: on-failure:3 depends_on: halodb: condition: service_healthy networks: halo_network: volumes: - ./:/root/.halo2 ports: - "8090:8090" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"] interval: 30s timeout: 5s retries: 5 start_period: 30s command: - --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo - --spring.r2dbc.username=root # MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。 - --spring.r2dbc.password=0000 - --spring.sql.init.platform=mysql # 外部访问地址,请根据实际需要修改 - --halo.external-url=http://localhost:8090/ # 初始化的超级管理员用户名 - --halo.security.initializer.superadminusername=admin # 初始化的超级管理员密码 - --halo.security.initializer.superadminpassword=660910../ halodb: image: mysql:8.0.31 container_name: halodb restart: on-failure:3 networks: halo_network: command: - --default-authentication-plugin=mysql_native_password - --character-set-server=utf8mb4 - --collation-server=utf8mb4_general_ci - --explicit_defaults_for_timestamp=true volumes: - ./mysql:/var/lib/mysql - ./mysqlBackup:/data/mysqlBackup ports: - "3306:3306" healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"] interval: 3s retries: 5 start_period: 30s environment: # 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值 - MYSQL_ROOT_PASSWORD=0000 - MYSQL_DATABASE=halo networks: halo_network: ``` ### 3.3.启动halo服务 ```shell [root@localhost halo]# docker-compose up -d [+] Running 23/23 ✔ halo 10 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 348.8s ✔ 9d19ee268e0d Pull complete 15.0s ✔ f2b566cb887b Pull complete 11.4s ✔ 2eb275343c46 Pull complete 325.8s ✔ d6398d1ffae6 Pull complete 12.7s ✔ c6cc8e703200 Pull complete 14.1s ✔ ae6a9433814d Pull complete 40.5s ✔ 2c46e2604ceb Pull complete 17.0s ✔ 4f4fb700ef54 Pull complete 18.4s ✔ 8d293f9b2fa4 Pull complete 21.6s ✔ 0e19c09dfee6 Pull complete 23.0s ✔ halodb 11 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 192.6s ✔ 0ed027b72ddc Pull complete 141.3s ✔ 0296159747f1 Pull complete 25.0s ✔ 3d2f9b664bd3 Pull complete 27.0s ✔ df6519f81c26 Pull complete 29.6s ✔ 36bb5e56d458 Pull complete 31.1s ✔ 054e8fde88d0 Pull complete 34.1s ✔ f2b494c50c7f Pull complete 46.1s ✔ 132bc0d471b8 Pull complete 47.4s ✔ 135ec7033a05 Pull complete 61.3s ✔ 5961f0272472 Pull complete 62.9s ✔ 75b5f7a3d3a4 Pull complete 64.2s [+] Running 3/3 ✔ Network halo_halo_network Created 0.2s ✔ Container halodb Healthy 0.2s ✔ Container halo Started 0.0s ``` ### 3.4.测试访问 ![](/media/202309/image-20230818165703762.png) ### 3.5.安装nginx并配置nginx反向代理 #提前拷贝一份nginx.conf核心配置文件至相关目录下 ``` [root@localhost halo]# docker run --name nginx -it -d -p 80:80 \ > -v /usr/local/nginx/html:/usr/local/nginx/html \ > -v /usr/local/nginx/conf.d:/usr/local/nginx/conf.d \ > -v /usr/local/nginx/logs:/usr/local/nginx/logs \ > -v /usr/local/nginx/conf/nginx.conf:/usr/local/nginx/conf/nginx.conf \ > --network halo_halo_network bcf638382021 ``` ``` [root@localhost halo]# vim /usr/local/nginx/conf/nginx.conf proxy_pass http://halo:8090; ``` 测试 ![](/media/202309/image-20230818174125198.png)
admin
Sept. 19, 2023, 5:06 p.m.
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
IT集中营导航
IT集中营导航
Markdown文件
share
link
type
password
Update password