[Docker]九.Docker compose讲解

docker-compose docker 官方的一个开源项目,可以实现对 docker 容器集群的快速编排,
docker-compose 通过一个 配置文件 来管理多个 Docker 容器,在配置文件中,所有的容器通过
services 来定义,然后使用 docker-compose脚本 启动,停止和重启 容器,使用 docker-compose 可以对项目进行 快速部署

 

一.Docker命令部署Nginx + Go Web+Mysql项目

golang 部署 见 [Docker]六.Docker自动部署nodejs以及golang项目

1.Docker部署mysql数据库

(1).docker images查看是否存在mysql镜像

docker images查看是否存在mysql镜像不存在则通过docker pull mysql 下载

#查看镜像
[root@MiWiFi-R3L-srv ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
mycentos     v1        4ba38cf3943b   18 hours ago   434MB#发现没有mysql镜像,下载
[root@MiWiFi-R3L-srv ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
8e0176adc18c: Pull complete 
2d2c52718f65: Pull complete 
d88d03ce139b: Pull complete 
4a7d7f11aa1e: Pull complete 
ce5949193e4c: Pull complete 
f7f024dfb329: Pull complete 
5fc3c840facc: Pull complete 
509068e49488: Pull complete 
cbc847bab598: Pull complete 
942bef62a146: Pull complete 
Digest: sha256:1773f3c7aa9522f0014d0ad2bbdaf597ea3b1643c64c8ccc2123c64afd8b82b1
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest#已经下载好了mysql镜像 
[root@MiWiFi-R3L-srv ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
mycentos     v1        4ba38cf3943b   18 hours ago   434MB
mysql        latest    a3b6608898d6   4 weeks ago    596MB

(2).创建mysql配置文件

(3).通过mysql镜像启动一个容器

docker run --name myMysql -p 3306:3306 -v /root/mysql/conf.d:/etc/mysql/conf.d -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
#通过mysql镜像,启动mysql容器
[root@MiWiFi-R3L-srv mysql]# docker run --name myMysql -p 3306:3306 -v /root/mysql/conf.d:/etc/mysql/conf.d -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
14aca92308e4816d26fbf4187635888421b4b8be141a5e65bef35614e0d2b921#查看是否启动mysql容器
[root@MiWiFi-R3L-srv mysql]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS          PORTS                                                  NAMES
14aca92308e4   mysql     "docker-entrypoint.s…"   About a minute ago   Up 58 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   myMysql

(4).通过可视化工具连接mysql

 (5).修改项目app.ini文件,连接容器mysql

 

通过上面布置,说明了goweb项目能够操作容器的mysql了,接下来就需要把本地的goweb项目部署到远程服务器上,也就是部署到远程服务器的容器上

2.打包Go Web项目,发布到远程容器中

(1).打包Go Web项目

参考[Docker]六.Docker自动部署nodejs以及golang项目

进入项目文件,执行下面语句,生成linux可执行文件:       

        set CGO_ENABLED=0
        set GOOS=linux
        set GOARCH=amd64
        go build -o goweb main.go

下一步需要把可执行文件,conf,static,templates,go.mod等静态文件发布到远程

(2).发布项目到远程

这里以发布到虚拟机(192.168.31.81)为例,发布到/root/wwwroot下

 (3).浏览器访问

接下来就需要把Go Web项目部署到容器中去 

(4).启动一个centos的docker容器,部署Go Web项目

docker run -it -d --name 容器名 -p 本地端口 : 容器端口 -v 本地文件夹:容器文件夹   --link 容器名 : 镜像名   镜像名
  • -v 映射数据卷(映射目录)
  • --link 容器名:镜像名   表示配置别名,这样可以通过容器名来访问容器
  • docker run -it -d  --name goweb01 --link myMysql:mysql -p 8080:8080 -v  /root/wwwroot/:/root centos
  • 比如上面的 goweb01就可以通过myMysql来访问数据库

启动一个centos容器: 

#启动一个centos容器,并指定名称以及开启端口,映射数据卷等
[root@MiWiFi-R3L-srv ~]# docker run -it -d --name goweb01 --link myMysql:mysql -p 8080:8080 -v /root/wwwroot/:/root 4ba38cf3943b
ecec9c9dd9627dfd9b2008a257f72668908d88b49967aa248a728ad11bf412ef
[root@MiWiFi-R3L-srv ~]# #发现已经启动了goweb01
[root@MiWiFi-R3L-srv ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
ecec9c9dd962   4ba38cf3943b   "/bin/sh -c /bin/bash"   7 seconds ago   Up 2 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp              goweb01
14aca92308e4   mysql          "docker-entrypoint.s…"   4 hours ago     Up 4 hours     0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   myMysql

进入容器,然后设置项目后台运行,然后curl访问:

命令:nohup ./goweb &   项目可以在后台运行

#查看运行的容器
[root@MiWiFi-R3L-srv ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
ecec9c9dd962   4ba38cf3943b   "/bin/sh -c /bin/bash"   7 seconds ago   Up 2 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp              goweb01
14aca92308e4   mysql          "docker-entrypoint.s…"   4 hours ago     Up 4 hours     0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   myMysql#进入goweb01容器
[root@MiWiFi-R3L-srv ~]# docker exec -it ecec9c9dd962 /bin/bash
bash-4.2# cd /root/
bash-4.2# ls
ginGorm#设置权限
bash-4.2# chmod -R 777 ginGorm/
bash-4.2# cd ginGorm/
bash-4.2# ls
conf  go.mod  go.sum  goweb  static  templates#启动项目,后台运行
bash-4.2# nohup ./goweb &     
[1] 27
bash-4.2# nohup: ignoring input and appending output to 'nohup.out'#curl访问,没问题
bash-4.2# curl 127.0.0.1:8080<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><link rel="stylesheet" href="/static/css/base.css">
</head>
<body><h1>我是一个GoWeb+Mysql的项目</h1><br>我是一个msg<br>2023-07-19 17:40:18<br><h3>这里可以显示客户端ip:</h3><p>  172.17.0.3</p></body>
</html>
bash-4.2# 

在浏览器中访问:

  这里讲一下上面的--link,在启动容器后,进入容器cat /etc/hosts可以看到:

[root@MiWiFi-R3L-srv ~]# docker exec -it ecec9c9dd962 /bin/bash
bash-4.2# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters#这里就是--link配置后生成的mysql,有一个myMysql,这个是一个别名,项目就可以通过这个别名来访问数据库
172.17.0.2      mysql 14aca92308e4 myMysql
172.17.0.3      ecec9c9dd962
bash-4.2# #可以ping通
bash-4.2# ping myMysql
PING mysql (172.17.0.2) 56(84) bytes of data.
64 bytes from mysql (172.17.0.2): icmp_seq=1 ttl=64 time=0.127 ms
64 bytes from mysql (172.17.0.2): icmp_seq=2 ttl=64 time=0.130 ms
^C
--- mysql ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1011ms

可以修改app.ini数据库配置,直接使用别名访问:

3.docker 部署nginx转发服务  

当需要通过域名而不是ip访问项目时,就需要配置nginx了

(1).创建nginx配置目录

(2).生成nginx.conf文件

upstream backendtest {ip_hash;server goweb01:8080;
}
server {listen 80;server_name docker.test.com;location / {#设置主机头和客户端真实地址,以便服务器获取客户端真实IP#禁用缓存proxy_buffering off;#反向代理的地址proxy_pass http://backendtest;}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}
}

(3).下载nginx镜像,并启动一个nginx容器 

docker run -it -d --name 容器名 -p 本地端口:容器端口 --link 容器名:镜像名 -v 数据卷:容器数据卷 镜像名

docker pull nginx
docker run -it -d --name nginxweb -p 80:80 --link goweb01:centos -v/root/nginx/conf.d/:/etc/nginx/conf.d nginx
#启动一个nignx容器,并开启端口,映射数据卷
[root@MiWiFi-R3L-srv conf.d]# docker run -it -d --name nginxweb -p 80:80 --link goweb01:centos -v /root/nginx/conf.d/:/etc/nginx/conf.d nginx
a0f45848b9ed30b10e178e66d1bf58478f5719f017a0bb736b8b9fc7f0de0000#查看启动的容器: 已经启动了mysql,goweb01,nginx容器
[root@MiWiFi-R3L-srv conf.d]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
a0f45848b9ed   nginx          "/docker-entrypoint.…"   13 seconds ago   Up 5 seconds    0.0.0.0:80->80/tcp, :::80->80/tcp                      nginxweb
ecec9c9dd962   4ba38cf3943b   "/bin/sh -c /bin/bash"   34 minutes ago   Up 34 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp              goweb01
14aca92308e4   mysql          "docker-entrypoint.s…"   4 hours ago      Up 4 hours      0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   myMysql

(4).配置本地hosts,设置域名

 二.Dockerfile部署Nginx+ Go Web+mysql项目

Dockerfile 部署 Nginx+ Go Web+mysql 项目 和docker部署项目类似,这里在另一台服务器(192.168.31.117)上演示

 1.Docker部署mysql数据库

该步骤和上面步骤mysql数据库步骤一致,这里就不讲解了

2.打包Go Web项目,发布到远程容器中

(1).打包Go Web项目,并发布到远程服务端/root/wwwroot/下

该步骤和上面步骤一致,结果如下:

 (2).新建Dockerfile,编写生成镜像所需

在/root/wwwroot/下新建Dockerfile,并写入以下内容

FROM centos:centos7
ADD ginGorm.tar.gz /root
WORKDIR /root
RUN chmod -R 777 ginGorm
WORKDIR /root/ginGorm
EXPOSE 8080
ENTRYPOINT ["./goweb"]

(3).打包项目

(4).执行build,生成镜像

[root@MiWiFi-R3L-srv wwwroot]# docker build -t gowebimg:v1.0.1 .
[+] Building 19.4s (10/10) FINISHED                                                                                    docker:default=> [internal] load build definition from Dockerfile                                                                             0.1s=> => transferring dockerfile: 242B                                                                                             0.0s=> [internal] load .dockerignore                                                                                                0.1s=> => transferring context: 2B                                                                                                  0.0s=> [internal] load metadata for docker.io/library/centos:centos7                                                                1.1s=> [internal] load build context                                                                                                0.6s=> => transferring context: 8.94MB                                                                                              0.6s=> CACHED [1/5] FROM docker.io/library/centos:centos7@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4   0.0s=> [2/5] ADD /ginGorm.tar.gz /root                                                                                              0.5s=> [3/5] WORKDIR /root                                                                                                          0.0s=> [4/5] RUN chmod -R 777 ginGorm                                                                                               9.8s=> [5/5] WORKDIR /root/ginGorm                                                                                                  0.5s=> exporting to image                                                                                                           5.8s=> => exporting layers                                                                                                          4.6s=> => writing image sha256:be3c1ee42ce234885fe50ff06de2e7dcca79e8c4dfa01183f462accaa38ba871                                     0.8s=> => naming to docker.io/library/gowebimg:v1.0.1                                                                               0.4s
[root@MiWiFi-R3L-srv wwwroot]# 
[root@MiWiFi-R3L-srv wwwroot]# ll
total 8736
-rw-r--r--. 1 root root     143 Nov 22 04:04 Dockerfile
drwxrwxrwx. 5 root root      90 Nov 22 03:49 ginGorm
-rw-r--r--. 1 root root 8940056 Nov 22 04:00 ginGorm.tar.gz#查看生成的gowebimg镜像
[root@MiWiFi-R3L-srv wwwroot]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
gowebimg     v1.0.1    be3c1ee42ce2   About a minute ago   237MB
mycentos     v1        38ea0d55bfbe   24 hours ago         434MB
mysql        latest    a3b6608898d6   4 weeks ago          596MB
[root@MiWiFi-R3L-srv wwwroot]# 

(4).通过生成的gowebimg镜像启动容器

docker run -it -d --name goweb01 -p 8080:8080 --link myMysql:mysql gowebimg:v1.0.1

(5).直接进入容器访问测试

#查看gowebimg容器生成的镜像
[root@MiWiFi-R3L-srv wwwroot]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED             STATUS             PORTS                                                  NAMES
b89c74fa36d0   gowebimg:v1.0.1   "./goweb"                13 seconds ago      Up 5 seconds       0.0.0.0:8080->8080/tcp, :::8080->8080/tcp              goweb01
1eba1d7316e1   mysql             "docker-entrypoint.s…"   About an hour ago   Up About an hour   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   myMysql#进入goweb01容器
[root@MiWiFi-R3L-srv wwwroot]# docker exec -it b8 /bin/bash#curl测试访问,发现没问题
[root@b89c74fa36d0 ginGorm]# curl 127.0.0.1:8080<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><link rel="stylesheet" href="/static/css/base.css">
</head>
<body><h1>我是一个GoWeb+Mysql的项目</h1><br>我是一个msg<br>2023-07-19 17:40:18<br><h3>这里可以显示客户端ip:</h3><p>  172.17.0.3</p></body>
</html>
[root@b89c74fa36d0 ginGorm]# 

上面就是通过Dockerfile生成一个项目镜像,然后启动容器访问项目,这样的话,goweb项目就部署好了,下来就来配置nginx了

3.docker 部署nginx转发服务  

这里和上面一致,就不再讲解了,部署完后,修改hosts文件就可以通过浏览器访问了

好了,通过Dockerfile部署项目就完成了,通过上面的部署,发现:要部署mysql,nginx,goweb项目三个docker,那有没有一种方式可以通过一个文件一次性地部署几个docker呢,下面讲解docker compose

 三.通过docker compose 部署项目

Docker-Compose Docker 官方的开源项目,可以实现对 Docker 容器集群的快速编排,使用 docker compose可以对项目进行快速部署

1.安装docker-compose 

见linux环境,centos8下 docker及docker compose安装教程

2.docker-compose 部署nginx+mysql+goWeb项目

(1).编写docker-compose.yml文件

要使用docker-compose  部署项目,就需要一个docker-compose.yml文件,内容如下:

#指定docker-compose 版本
version: "3"#services下就是容器的编写
services:#容器,myMysql:#来自哪个镜像image: mysql#容器名,如果不指定,则使用myMysql这个容器默认名称container_name: myMysql#环境变量:配置用户名,密码等environment:MYSQL_ROOT_PASSWORD: 123456#restart:  表示容器挂掉后是否重启, always 一直重启restart: always#映射的端口ports:- 3306:3306#数据卷的挂载volumes:- /root/mysql/conf.d:/etc/mysql/conf.d- /root/mysql/data:/var/lib/mysql#配置goweb01项目容器goweb01:#build编译成镜像,可以使用上面的/root/wwwroot/Dockerfile里面的build:context: ./dockerfile: Dockerfile#当然,也可以使用已经编译号的gowebimg镜像#image: gowebimgcontainer_name: goweb01restart: alwaysports:- 8080:8080#depends_on表示创建好myMysql这个容器后,再来创建goweb01这个容器depends_on:- myMysql#配置nginx容器nginx:image: nginxcontainer_name: nginxrestart: alwaysports:- 80:80depends_on:- goweb01volumes:- /root/nginx/conf.d/:/etc/nginx/conf.d

(2).编译运行容器

#这里把docker-compose.yml放在该目录下
[root@MiWiFi-R3L-srv wwwroot]# ll
total 8740
-rw-r--r--. 1 root root    1428 Nov 22 05:13 docker-compose.yml
-rw-r--r--. 1 root root     143 Nov 22 04:04 Dockerfile
drwxrwxrwx. 5 root root      90 Nov 22 03:49 ginGorm
-rw-r--r--. 1 root root 8940056 Nov 22 04:00 ginGorm.tar.gz#docker compose up 启动容器
[root@MiWiFi-R3L-srv wwwroot]# docker compose up
[+] Building 7.4s (10/10) FINISHED                                                                                     docker:default=> [goweb01 internal] load .dockerignore                                                                                        0.5s=> => transferring context: 2B                                                                                                  0.1s=> [goweb01 internal] load build definition from Dockerfile                                                                     0.6s=> => transferring dockerfile: 242B                                                                                             0.2s=> [goweb01 internal] load....#查看通过docker compose 是否启动了mysql,goweb,nginx容器
[root@MiWiFi-R3L-srv wwwroot]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS                          PORTS                                                  NAMES
2df006c60407   nginx             "/docker-entrypoint.…"   3 minutes ago   Restarting (1) 24 seconds ago                                                          nginx
1e374c641de3   wwwroot-goweb01   "./goweb"                3 minutes ago   Up 3 minutes                    0.0.0.0:8080->8080/tcp, :::8080->8080/tcp              goweb01
868ba8ad9178   mysql             "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes                    0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   myMysql
docker compose up

(3).后台运行

docker compose up -d

(4).一些问题

docker 运维的过程中经常会遇到一个问题,启动一个 docker - compose.yml 文件时,虽然使用 depends_on 属性用依赖关系定义了两个容器的启动顺序,但这个顺序仅仅是 docker 创建启动的顺序,而并不是在上一个容器完全启动成功的情况下启动下一个容器。depends_on 在启动 web 这个容器前,并不会等待db redis 这个两个容器进入 ready状态,而只是等到它们被启动状态了,这里可以再次 重新启动相关容器,就可以解决(docker compose restart 容器名) ,也可以通过借 wait-for-it.sh 配置 nginx+mysql+goWeb 项目配置容器启动顺序
wait-for-it.sh是GitHub中开源一个脚本,很轻量也很实用
注意 wait-for-it.sh 需要放在 ginGorm 文件中
这时需在docker-compose.yml中的goweb01下加入一下代码即可
command: ["./wait-for-it.sh","myMysql:3306","--","./goweb"]

3.docker compose 常用命令

(1).docker compose build命令

(重新)构建 docker - compose.yml 文件中的服务,生成镜像。 如果一个服务是使用 build 元素构建的,那么一旦你更改了这个服务的 Dockerfile ,就需要运行 docker compose build 重新构建它,以保证之后 up 时运行的服务容器是最新的
docker compose build

 选项:

        –force-rm:总是删除构建过程中的临时容器
        –no-cache:镜像构建过程中不使用 cache
        –pull:始终先尝试通过 pull 来获取最新版本的镜像

(2).docker compose up命令

这是最重要且最常用的一个命令,大部分时候都可以直接通过该命令来启动一个项目,它将自动完成 构建镜像、(重新)创建服务、按依赖顺序启动任何关联的服务 等一系列操作
docker compose up

 

默认情况下, docker compose up 启动的容器都在前台,控制台将实时打印所有容器的输出信息(以不同的颜色标识不同的服务),可以很方便进行调试。当按下 Ctrl+C 时,所有容器都会被停止。
如果使用 docker compose up -d ,则所有服务将在后台启动.一般生产环境下推荐使用该选项
docker compose up -d

 需要注意的是,如果某个服务容器是通过build元素进行构建的,并且该服务对应的镜像已经存在,那 么即使Dockerfile文件内容已经变更,docker compose up也不会重新构建该服务,此时你需要先执行 docker compose build构建镜像,再执行docker compose up

docker compose build && docker compose up

 –scale:设置某个服务要启动的容器数量

提示:

        需要在docker-compose.yml 中去掉container_name,去掉goweb01绑定的端口

docker compose up --scale='goweb01=3'
docker compose up --scale='goweb01=3' -d

 选项:

        -d:在后台运行服务容器
        -no-deps:不启动服务所依赖的其他服务(由 depends_on 元素指定)
        -no-color:不使用颜色来区分不同服务的控制台输出
        -force-recreate:总是重新创建容器,不能与 --no-recreate 同时使用
        -no-recreate:如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用
        -no-build:不进行服务镜像的构建,即使该服务镜像不存在
        -t, --timeout TIMEOUT:停止容器时的超时时间(默认为 10 秒)
        -scale:设置某个服务要启动的容器数量,用于快速扩容 / 缩容,例如 --scale='web=3' 将为 web 服务启动3 个容器副本,并且会覆盖 docker-compose.yml 中原有的 scales 设置

(3).docker compose stop命令

停止项目中的所有服务容器,稍后可以通过 docker compose start 再次启动

docker compose stop

(4).docker compose start命令

启动项目中的所有服务容器

docker compose start

 (5).docker compose restart命令

重启项目中的所有服务容器,只是重启不会重新构建项目

docker compose restart

 (6).docker compose convert

可以借助这个命令来验证 docker-compose.yml 文件格式是否正确,若错误则会显示错误原因

[root@localhost ~]# docker compose convert
yaml: line 9: did not find expected key

 (7).docker compose exec

进入/退出容器类似,只不过它针对的是服务,可在指定的服务容器中执行命令

docker compose exec goweb01 /bin/bash

(8).docker compose images

列出所有已创建的服务容器的镜像信息

docker compose images

 (9).docker compose ls

列出 Docker 上正在运行的所有项目,该信息与当前所在的项目无关
选项:
        –all , -a:同时显示已停止的项目
[root@MiWiFi-R3L-srv wwwroot]# docker compose ls
NAME                STATUS                      CONFIG FILES
wwwroot             restarting(1), running(2)   /root/wwwroot/docker-compose.yml
[root@MiWiFi-R3L-srv wwwroot]# docker compose ls -a
NAME                STATUS                      CONFIG FILES
wwwroot             restarting(1), running(2)   /root/wwwroot/docker-compose.yml
[root@MiWiFi-R3L-srv wwwroot]# 

(10).docker compose ps

查看docker compose运行的容器信息,类似于docker ps

docker compose ps
[root@MiWiFi-R3L-srv wwwroot]# docker compose ps
NAME      IMAGE             COMMAND                                          SERVICE   CREATED          STATUS                          PORTS
goweb01   wwwroot-goweb01   "./goweb"                                        goweb01   25 minutes ago   Up 21 minutes                   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
myMysql   mysql             "docker-entrypoint.sh mysqld"                    myMysql   25 minutes ago   Up 22 minutes                   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx     nginx             "/docker-entrypoint.sh nginx -g 'daemon off;'"   nginx     25 minutes ago   Restarting (1) 50 seconds ago   
-a 查看 docker compose 运行的所有容器信息
docker compose ps -a

 (11).docker compose logs

查看当前项目下所有服务容器的日志输出。默认情况下, docker compose logs 将对不同的服务输出使用不同的颜色来区分,可以通过 -- no - color 来关闭颜色,该命令在调试问题的时候十分有用。
docker compose logs

(12).docker compose port

打印某个服务容器的内部端口所映射的公共端口(宿主机端口)
选项:
        –protocol=proto:指定端口协议, tcp (默认值)或者 udp
        –index=index:如果同一服务存在多个容器副本,可用此选项指定容器的序号(默认为 1)
$ docker compose port mysql 3306
0.0.0.0:3307
$ docker compose port redis 6379
0.0.0.0:6380

(13).docker compose rm

删除所有已停止的服务容器,正式项目推荐先执行 docker compose stop 命令来停止容器,删除所有docker compose 容器
docker compose rm -f

 (14).docker compose version

打印 Docker Compose 版本信息,该信息与当前所在的项目无关
docker compose version

(15).docker compose run

格式:
docker compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] [-l
KEY=VALUE...] SERVICE [COMMAND] [ARGS...]
        此命令的行为和创建并启动容器相似,它总是为某个服务创建并启动一个全新的容器,例如,以下命令为web 服务创建并启动一个容器,然后执行 /bin/bash 命令:
docker compose run goweb01 /bin/bash

 此命令一定会创建一个新的容器,其配置由docker-compose.yml中的web服务所定义,包括数据卷、 网络、依赖关系、环境变量等详细信息

此命令和 docker compose up 有两个重要区别:
        此命令可以重写服务的启动命令(docker-compose.yml 中定义的 command 元素)
        例如,如果 web 服务的启动命令是 /bin/bash (由 command 元素指定),那么
docker compose run goweb01 /bin/sh 将会把启动命令重写为/bin/sh

 注意

        此命令不会自动创建docker-compose.yml中配置的任何端口映射,以避免端口冲突

如果确实想为服务创建端口并将其映射到宿主机,请指定端口: 

docker compose run -d --name ginweb02 -p 8082:8080 goweb01

 默认情况下,如果存在依赖关系(由depends_on元素指定),则所有被依赖的服务将会被自动启动, 除非这些服务已经在运行中,如果不希望 run 命令启动依赖的其他容器,请使用 --no-deps 选项

docker compose run --no-deps -d --name ginweb03 -p 8083:8080 goweb01

 如果只想创建一次的容器,在容器停止后自动删除它,可以使用 --rm选项:

docker compose run --rm updateDb

 选项:

        -d: 在后台运行容器
        -name NAME: 为容器指定一个名字,默认为项目名 - 服务名 -uuid
        -entrypoint CMD: 覆盖默认的容器启动命令
        -e KEY=VAL: 设置环境变量,可以多次指定此选项来设置多个环境变量
        -u, --user=“”: 指定运行容器的用户名或者 uid
        -no-deps: 不启动所其他的其他服务容器
        -rm: 容器运行完成时自动删除容器
        -p, --publish=[]: 手动映射容器端口到宿主机,和 3.1 创建并启动容器一样
        -service-ports: 使 docker-compose.yml 中配置的端口映射生效,默认忽略

 4.docker-compose 动态扩展容器

实现动态扩容,就是在启动容器的额时候多增加几个相关的容器,以便实现负载均衡等操作

(1).docker compose up --scale 实现 容器扩容

需要删除docker-compose.yml中对应容器的掉container_name,去掉绑定的端口,如:

#指定docker-compose 版本
version: "3"#services下就是容器的编写
services:#容器,myMysql:#来自哪个镜像image: mysql#容器名,如果不指定,则使用myMysql这个容器默认名称container_name: myMysql#环境变量:配置用户名,密码等environment:MYSQL_ROOT_PASSWORD: 123456#restart:  表示容器挂掉后是否重启, always 一直重启restart: always#映射的端口ports:- 3306:3306#数据卷的挂载volumes:- /root/mysql/conf.d:/etc/mysql/conf.d- /root/mysql/data:/var/lib/mysql#配置goweb01项目容器goweb01:#build编译成镜像,可以使用上面的/root/wwwroot/Dockerfile里面的build:context: ./dockerfile: Dockerfile#当然,也可以使用已经编译号的gowebimg镜像#image: gowebimg#container_name: goweb01restart: always#ports:#    - 8080:8080#depends_on表示创建好myMysql这个容器后,再来创建goweb01这个容器depends_on:- myMysql#配置nginx容器nginx:image: nginxcontainer_name: nginxrestart: alwaysports:- 80:80depends_on:- goweb01volumes:- /root/nginx/conf.d/:/etc/nginx/conf.d

 然后执行:

docker compose up --scale='goweb01=3' -d
[root@MiWiFi-R3L-srv wwwroot]# docker compose up --scale='goweb01=3' -d
[+] Running 5/5✔ Container myMysql            Started                                                                                          0.9s ✔ Container wwwroot-goweb01-3  Started                                                                                          2.0s ✔ Container wwwroot-goweb01-1  Started                                                                                          2.0s ✔ Container wwwroot-goweb01-2  Started                                                                                          1.9s ✔ Container nginx              Started                                                                                          0.8s 
[root@MiWiFi-R3L-srv wwwroot]# 
[root@MiWiFi-R3L-srv wwwroot]# docker compose ps
NAME                IMAGE             COMMAND                                          SERVICE   CREATED         STATUS                         PORTS
myMysql             mysql             "docker-entrypoint.sh mysqld"                    myMysql   3 minutes ago   Up 2 minutes                   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx               nginx             "/docker-entrypoint.sh nginx -g 'daemon off;'"   nginx     3 minutes ago   Restarting (1) 4 seconds ago   
wwwroot-goweb01-1   wwwroot-goweb01   "./goweb"                                        goweb01   3 minutes ago   Up About a minute              8080/tcp
wwwroot-goweb01-2   wwwroot-goweb01   "./goweb"                                        goweb01   3 minutes ago   Up About a minute              8080/tcp
wwwroot-goweb01-3   wwwroot-goweb01   "./goweb"                                        goweb01   3 minutes ago   Up About a minute              8080/tcp

(2).通过docker-compose.yml配置容器副本以及占用的cpu

#指定docker-compose 版本
version: "3"#services下就是容器的编写
services:#容器,myMysql:#来自哪个镜像image: mysql#容器名,如果不指定,则使用myMysql这个容器默认名称container_name: myMysql#环境变量:配置用户名,密码等environment:MYSQL_ROOT_PASSWORD: 123456#restart:  表示容器挂掉后是否重启, always 一直重启restart: always#映射的端口ports:- 3306:3306#数据卷的挂载volumes:- /root/mysql/conf.d:/etc/mysql/conf.d- /root/mysql/data:/var/lib/mysql#配置goweb01项目容器goweb01:#build编译成镜像,可以使用上面的/root/wwwroot/Dockerfile里面的build:context: ./dockerfile: Dockerfile#当然,也可以使用已经编译号的gowebimg镜像#image: gowebimg#container_name: goweb01restart: always#ports:#    - 8080:8080deploy:replicas: 3 #副本数量resources: #资源limits: #配置cpucpus: "0.5" # 设置该容器最多只能使用 50% 的 CPUmemory: 500M # 设置该容器最多只能使用 500M内存restart_policy: #定义容器重启策略, 用于代替 restart 参数condition: on-failure #只有当容器内部应用程序出现问题才会重启#depends_on表示创建好myMysql这个容器后,再来创建goweb01这个容器depends_on:- myMysql#配置nginx容器nginx:image: nginxcontainer_name: nginxrestart: alwaysports:- 80:80depends_on:- goweb01volumes:- /root/nginx/conf.d/:/etc/nginx/conf.d

然后执行docker compose up -d,同样可以创建多个容器,当某个容器挂掉后,就回去访问另一个容器,这样就到了负载均衡操作,好了,docker compose 讲解完毕,下一节讲解Docker Swarm

[上一节][Docker]八.Docker 容器跨主机通讯

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/160652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nuxt.js Next.js Nest.js

Nuxt.js和Next.js都是服务端渲染框架(SSR)&#xff0c;属于前端框架,Nest.js则是node框架,属于后端框架。 其中Nuxt.js是vue的ssr框架&#xff0c;Next.js是react的ssr框架。 都是比vue和react更上层的前端框架。 文章目录 1.SSR2.Nuxt2.1 Nuxt的下载2.2 Nuxt的集成2.3 Nuxt…

HuggingFace-利用BERT预训练模型实现中文情感分类(下游任务)

准备数据集 使用编码工具 首先需要加载编码工具&#xff0c;编码工具可以将抽象的文字转成数字&#xff0c;便于神经网络后续的处理&#xff0c;其代码如下&#xff1a; # 定义数据集 from transformers import BertTokenizer, BertModel, AdamW # 加载tokenizer token Ber…

langchain 部署组件-LangServe

原文&#xff1a;&#x1f99c;️&#x1f3d3; LangServe | &#x1f99c;️&#x1f517; Langchain LangServe &#x1f6a9; We will be releasing a hosted version of LangServe for one-click deployments of LangChain applications. Sign up here to get on the wa…

OpenLayers入门,OpenLayers6的WebGLPointsLayer图层样式和运算符详解,四种symbolType类型案例

专栏目录: OpenLayers入门教程汇总目录 前言 本章讲解使用OpenLayers6的WebGL图层显示大量点情况下,列举出所有WebGLPointsLayer图层所支持的所有样式运算符大全。 补充说明 本篇主要介绍OpenLayers6.x版本的webgl图层,OpenLayers7.x和OpenLayers8.x主要更新内容就是webgl…

GB28181学习(十七)——基于jrtplib实现tcp被动和主动发流

前言 GB/T28181-2022实时流的传输方式介绍&#xff1a;https://blog.csdn.net/www_dong/article/details/134255185 基于jrtplib实现tcp被动和主动收流介绍&#xff1a;https://blog.csdn.net/www_dong/article/details/134451387 本文主要介绍下级平台或设备发流功能&#…

生活如果真能像队列一样的话

生活如果真能像队列一样&#xff0c;那该多好啊。 —————————————————————————————————————————— 背包&#xff0c;队列 可以先看他们的API&#xff1a;都含有一个无参构造函数&#xff0c;添加单个元素的方法&#xff0c;测试集合…

基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码

基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于材料生成优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

ROSNS3(一)

https://github.com/malintha/rosns3 第一步&#xff1a;clone和构建rosns3客户端 第二步&#xff1a;运行 最详细的ubuntu 安装 docker教程 - 知乎 1. unable to find source space /home/muta/src 解决方法&#xff1a; 将副将将碰到的bug&#xff0c;解决方法_#include &…

Python从零开始快速搭建一个语音对话机器人

文章目录 01-初心缘由02-准备工作03-语音机器人的搭建思路04-语音生成音频文件05-音频文件转文字STT06-与图灵机器人对话07-文字转语音08-语音对话机器人的完整代码09-结束语10-有问必答关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学…

SSH连接远程服务器报错:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED 解决方法

一.错误描述 报错信息里提示了路径信息/root/.ssh/known_hosts:20 二.解决方案 方法一 输入以下指令&#xff1a; ssh-keygen -R XXX&#xff08;需要连接远程服务器的ip&#xff09; 按照我的例子ip:10.165.7.136&#xff0c;会返回以下信息: 重新尝试连接&#xff1a; 输…

规划类3d全景线上云展馆帮助企业轻松拓展海外市场

科技3D线上云展馆作为一种基于VR虚拟现实和互联网技术的新一代展览平台。可以在线上虚拟空间中模拟真实的展馆&#xff0c;让观众无需亲自到场&#xff0c;即可获得沉浸式的参观体验。通过这个展馆&#xff0c;您可以充分、全面、立体展示您的产品、服务以及各种创意作品&#…

2023年【安全生产监管人员】考试题及安全生产监管人员找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产监管人员考试题参考答案及安全生产监管人员考试试题解析是安全生产模拟考试一点通题库老师及安全生产监管人员操作证已考过的学员汇总&#xff0c;相对有效帮助安全生产监管人员找解析学员顺利通过考试。 1、…

数据结构-栈的实现

1.栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&…

Matlab群体智能优化算法之海象优化算法(WO)

文章目录 一、灵感来源二、算法的初始化三、GTO的数学模型Phase1&#xff1a;危险信号和安全信号Phase2&#xff1a;迁移&#xff08;探索&#xff09;Phase3&#xff1a;繁殖&#xff08;开发&#xff09; 四、流程图五、伪代码六、算法复杂度七、WO搜索示意图八、实验分析和结…

FreeRTOS列表和列表项

FreeRTOS内核调度使用了大量的列表&#xff08;list&#xff09;和列表项&#xff08;listitem&#xff09;数据结构。它的源码中涉及到很多列表的操作&#xff0c;对于FreeRTOS来说&#xff0c;列表就是它最基础的一部分&#xff0c;列表被用作FreeRTOS调度器使用&#xff0c;…

力扣.面试题 04.06. 后继者(java 树的中序遍历)

Problem: 面试题 04.06. 后继者 文章目录 题目描述思路解题方法复杂度Code 题目描述 设计一个算法&#xff0c;找出二叉搜索树中指定节点的“下一个”节点&#xff08;也即中序后继&#xff09;。 如果指定节点没有对应的“下一个”节点&#xff0c;则返回null。 思路 由于题…

Python开发运维:Celery连接Redis

目录 一、理论 1.Celery 二、实验 1.Windows11安装Redis 2.Python3.8环境中配置Celery 三、问题 1.Celery命令报错 2.执行Celery命令报错 3.Win11启动Celery报ValueErro错误 一、理论 1.Celery (1) 概念 Celery是一个基于python开发的分布式系统&#xff0c;它是简单…

JSP内置对象

一、request对象 1、访问请求参数 2、在作用域中管理属性 3、获取Cookie 4、解决中文乱码 5、获取客户端信息 6、显示国际化信息 是一个javax.servlet.http.HttpServletRequest对象 request封装了用户浏览器提交的信息&#xff0c;因此可以调用相应的方法可以获取这些封…

优先经验回放(prioritized experience replay)

prioritized experience replay 思路 优先经验回放出自ICLR 2016的论文《prioritized experience replay》。 prioritized experience replay的作者们认为&#xff0c;按照一定的优先级来对经验回放池中的样本采样&#xff0c;相比于随机均匀的从经验回放池中采样的效率更高&…