[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: gowebimg

        container_name: goweb01
        restart: always
        ports:
            - 8080:8080
        #depends_on表示创建好myMysql这个容器后,再来创建goweb01这个容器
        depends_on:
            - myMysql
    #配置nginx容器
    nginx:
        image: nginx
        container_name: nginx
        restart: always
        ports:
            - 80:80
        depends_on:
            - goweb01
        volumes:
            - /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: goweb01
        restart: always
        #ports:
        #    - 8080:8080
        #depends_on表示创建好myMysql这个容器后,再来创建goweb01这个容器
        depends_on:
            - myMysql
    #配置nginx容器
    nginx:
        image: nginx
        container_name: nginx
        restart: always
        ports:
            - 80:80
        depends_on:
            - goweb01
        volumes:
            - /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: goweb01
        restart: always
        #ports:
        #    - 8080:8080
        
        deploy:
            replicas: 3 #副本数量
            resources: #资源
                limits: #配置cpu
                    cpus: "0.5" # 设置该容器最多只能使用 50% 的 CPU
                    memory: 500M # 设置该容器最多只能使用 500M内存
            restart_policy: #定义容器重启策略, 用于代替 restart 参数
                condition: on-failure #只有当容器内部应用程序出现问题才会重启

        #depends_on表示创建好myMysql这个容器后,再来创建goweb01这个容器
        depends_on:
            - myMysql
    #配置nginx容器
    nginx:
        image: nginx
        container_name: nginx
        restart: always
        ports:
            - 80:80
        depends_on:
            - goweb01
        volumes:
            - /root/nginx/conf.d/:/etc/nginx/conf.d

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

10、信息打点——APP小程序篇抓包封包XP框架反编译资产提取

APP信息搜集思路 外在——抓包封包——资产安全测试 抓包&#xff08;Fiddle&茶杯&burp&#xff09;封包&#xff08;封包监听工具&#xff09;&#xff0c;提取资源信息 资产收集——资源提取——ICO、MAD、hash——FOFA等网络测绘进行资产搜集 外在——功能逻辑 内在…

pikachu靶场PHP反序列化漏洞

pikachu靶场PHP反序列化漏洞 源码分析 查看源代码 class S{var $test "pikachu";function __construct(){echo $this->test;} }// O:1:"S":1:{s:4:"test";s:29:"<script>alert(xss)</script>";} $html; if(isset($_PO…

pikachu_php反序列化

pikachu_php反序列化 源代码 class S{var $test "pikachu";function __construct(){echo $this->test;} }//O:1:"S":1:{s:4:"test";s:29:"<script>alert(xss)</script>";} $html; if(isset($_POST[o])){$s $_POST[…

优先级队列(priority_queue)

文章目录 优先级队列的定义定义&#xff1a;接口头文件优先队列和堆的关系使用&#xff1a;排序的规则容器 仿函数应用 队列存指针问题&#xff1a; 优先级队列的定义 定义&#xff1a; 黄色部分是仿函数 接口 头文件 这里不需要包含其他的头文件只需要使用队列的头文件就可以…

SpringBoot监听器解析

监听器模式介绍 监听器模式的要素 事件监听器广播器触发机制 SpringBoot监听器实现 系统事件 事件发送顺序 监听器注册 监听器注册和初始化器注册流程类似 监听器触发机制 获取监听器列表核心流程: 通用触发条件: 自定义监听器实现 实现方式1 实现监听器接口: Order(1) …

SPSS系统聚类

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

基于python人脸性别年龄检测系统-深度学习项目

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介简介技术组成1. OpenCV2. Dlib3. TensorFlow 和 Keras 功能流程 二、功能三、系统四. 总结 一项目简介 # Python 人脸性别年龄检测系统介绍 简介 该系统基…

VirtualBox配置共享文件夹,如果你一直安装增强功能失败,又没有尝试过改内核版本。。。

1 背景 想设置电脑本地和virtualbox虚拟机之间的共享文件夹&#xff0c;这样在电脑本地对共享文件的修改&#xff0c;就可以在虚拟机中被感知。 如果想配置共享文件夹&#xff0c;前提是必须安装virtualbox的增强功能。 我的虚拟机是7.0.10版本 安装的centOS8.5 可以看我之前的…

一篇文章搞懂WPF动画的使用技巧

WPF 动画系统提供了丰富的功能&#xff0c;用于为 UI 元素创建流畅的动态效果。动画可以应用于任何可用于渲染的属性&#xff0c;比如位置、颜色、大小等。在 WPF 中&#xff0c;动画是通过更改随时间变化的属性来实现的。 WPF动画基本用法 例如实现如下的动画效果&#xff1…

Kubernetes+Gitlab+Jenkins+ArgoCD多集群部署

KubernetesGitlabJenkinsArgoCD多集群部署 文章目录 KubernetesGitlabJenkinsArgoCD多集群部署1. KubernetesGitlabJenkinsArgoCD多集群部署2. 添加WebHooks自动触发3. Jenkins-构建-执行Shell4. 制作镜像及修改Yaml文件4.1 Dockerfile4.2 Build-Shell 5.自动部署Demo测试5.1 推…

基于跳蛛算法优化概率神经网络PNN的分类预测 - 附代码

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

三、防火墙-源NAT

学习防火墙之前&#xff0c;对路由交换应要有一定的认识 源NAT基本原理1.1.NAT No-PAT1.2.NAPT1.3.出接口地址方式&#xff08;Easy IP&#xff09;1.4.Smart NAT1.5.三元组 NAT1.6.多出口场景下的源NAT 总结延伸 ——————————————————————————————…

基于单片机直流电机调速(proteus仿真+源程序)

一、系统方案 1、本设计采用这51单片机作为主控器。 2、转速值送到液晶1602显示。 3、按键设加减速&#xff0c;开始暂停、正反转。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 en0; rw0; write_com(0x01); //lcd初始化 write_com(0x38)…

蓝桥杯算法双周赛心得——迷宫逃脱(记忆化搜索)

大家好&#xff0c;我是晴天学长&#xff0c;非常经典实用的记忆化搜索题&#xff0c;当然也可以用dp做&#xff0c;我也会发dp的题解&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .迷宫逃脱 迷官逃脱…

FPGA----ZCU106使用petalinux 2019.1(全网最详)

一、环境安装 1、软硬件需求&#xff1a;Vivado 2019.1、ZCU106、Ubuntu 18.04.1、petalinux 2019.1 本文基于2019.1版本的UG1144文档构建https://docs.xilinx.com/api/khub/documents/HXzkPWw1pfgmyp8i8JKniQ/content?Ft-Calling-Appft%2Fturnkey-portal&Ft-Calling-Ap…

2023年【起重机械指挥】考试题及起重机械指挥找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重机械指挥考试题考前必练&#xff01;安全生产模拟考试一点通每个月更新起重机械指挥找解析题目及答案&#xff01;多做几遍&#xff0c;其实通过起重机械指挥作业考试题库很简单。 1、【多选题】按照事故造成的人…

线程的几种状态

&#xff08;线程的几种状态&#xff09; 1.线程状态&#xff08;生命周期&#xff09; 1.1.源码中的状态 关于Java线程的状态&#xff0c;网上说法很多&#xff0c;有五种、六种甚至七种&#xff0c;本文采用Java官方的线程状态分类。 实际上&#xff0c;官方一共给出了六种…

攻防世界-web-Confusion1

1. 题目描述 打开链接&#xff0c;如图 点击Login和Rigister&#xff0c;都报错 但是有提示 指出了flag所在的位置&#xff0c;题目中直接能获取到的信息暂时就这么些了 2. 思路分析 既然告诉了我们flag文件的位置&#xff0c;那么要读取到这个文件&#xff0c;要么是任意文…

合并区间问题

以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;intervals [[1,…

【Vue】自定义指令

hello&#xff0c;我是小索奇&#xff0c;精心制作的Vue系列持续发放&#xff0c;涵盖大量的经验和示例&#xff0c;如果对您有用&#xff0c;可以点赞收藏哈~ 自定义指令 自定义指令就是自己定义的指令&#xff0c;是对 DOM 元素进行底层操作封装 ,程序化地控制 DOM&#xff…