GVKun编程网logo

docker-compose docker启动工具,容器互联(docker-compose启动命令)

13

本文将分享docker-composedocker启动工具,容器互联的详细内容,并且还将对docker-compose启动命令进行详尽解释,此外,我们还将为大家带来关于8天入门docker系列——第五

本文将分享docker-compose docker启动工具,容器互联的详细内容,并且还将对docker-compose启动命令进行详尽解释,此外,我们还将为大家带来关于8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署、Docker - 03 编排容器 Docker Compose 指令速查表、Docker Compose 和 Docker Swarm 和 Docker Service、docker compose容器互联的相关知识,希望对你有所帮助。

本文目录一览:

docker-compose docker启动工具,容器互联(docker-compose启动命令)

docker-compose docker启动工具,容器互联(docker-compose启动命令)

简介:

docker可以一条命令就运行一个配置好的服务器,很是方便。

但是也有一个问题就是,当参数比较多,映射目录比较多,映射端口比较多…………

我以前就是写个脚本,用脚本来启动,很low啊。

也见到一些docker镜像的介绍页有介绍docker-compose,但是因为一直都是小型的应用,也就没认真看这个东西,今天就深入学习一下吧。

Docker Compose是一个用来定义和运行复杂应用的Docker工具

里面的数据结构比我几行脚本清晰的多。而且可以同时启动多个容器,并且是根据依赖关系来先后启动。

比如先启动数据库,再启动博客。

 

一:安装

和安装docker差不多。

安装docker是  dnf install docker

安装docker-compose是 dnf install docker-compose

dnf 是我使用的fedora的包管理工具,根据你的linux版本不同,可能不一样。

 

二:无脑试用

 创建docker-compose.yml文件

version: ''2''
services:
    ssh:
            image: jackadam/alpine_with_ssh
            ports:
            - "2222:22"

  

然后在同目录下执行  docker-compose up -d

这样就启动了一个开放2222端口的apache。

关闭的时候在这里执行  docker-compose down

三:docker-compose命令

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file (default: docker-compose.yml)
  -p, --project-name NAME     Specify an alternate project name (default: directory name)
  --verbose                   Show more output
  --no-ansi                   Do not print ANSI control characters
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to

  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don''t check the daemon''s hostname against the name specified
                              in the client certificate (for example if your docker host
                              is an IP address)
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the Compose file)

Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  images             List images
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

build 构建或重建服务
help 命令帮助
kill 杀掉容器
logs 显示容器的输出内容
port 打印绑定的开放端口
ps 显示容器
pull 拉取服务镜像
restart 重启服务
rm 删除停止的容器
run 运行一个一次性命令
scale 设置服务的容器数目
start 开启服务
stop 停止服务
up 创建并启动容器

 

四:docker-compose.yml

简介:

这个就是配置容器启动的参数的。

先看一下官方给的示例:

version: ''3.3''

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:

  

这还是非常方便的,先启动db,然后启动wordpress。

下面逐步解释如何编写docker-compose.yml

 

1.基本结构

一个docker-compose.yml包含三大部分:

version  services  容器

上面示例中,db 和 wordpress 就是两个容器。

相关内容的第一行,就是容器的名字了。

 

2.image

在 services 标签下的第二级标签是 web,这个名字是用户自己自定义,它就是服务名称。
image 则是指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
例如下面这些格式都是可以的:

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: a4bc65fd

 

3.bulid

大家也经常使用Dockerfile来自己生成镜像。docker-compose自然也是支持的。

不写image,改为写buile,则是根据dockerfile来生成镜像

示例代码如下:

build:
      context: ../ 
      dockerfile: path/of/Dockerfile

我暂时只用到了

build: .  

类似于 docker build .

 

4.context(配合build)

context 选项可以是 Dockerfile 的文件路径,也可以是到链接到 git 仓库的url,当提供的值是相对路径时,它被解析为相对于撰写文件的路径,此目录也是发送到 Docker 守护进程的 context

5.dockerfile(配合build)

使用此 dockerfile 文件来构建,必须指定构建路径

build:
      context: .
      dockerfile: Dockerfile-alternate

6.args(配合build)

添加构建参数,这些参数是仅在构建过程中可访问的环境变量
首先, 在Dockerfile中指定参数:

ARG fendo
ARG password
 
RUN echo "Build number: $fendo"
RUN script-requiring-password.sh "$password"

  

然后指定 build 下的参数,可以传递映射或列表

build:
      context: .
      args:
        fendo: 1
        password: fendo

        - fendo=1
       - password=fendo

  

 指定构建参数时可以省略该值,在这种情况下,构建时的值默认构成运行环境中的值(还没理解)

args:
      - fendo
      - password

YAML布尔值(truefalseyesnoonoff)必须用引号括起来,这样分析器会将它们解释为字符串。

7.container_name

Compose 的容器名称格式是:<项目名称><服务名称><序号>

虽然可以自定义项目名称、服务名称,但是如果你想完全控制容器的命名,可以使用这个标签指定:

container_name: app

 

8.depends_on

在没启动数据库容器的时候启动了应用容器,这时候应用容器会因为找不到数据库而退出,为了避免这种情况我们需要加入一个标签,就是 depends_on,这个标签解决了容器的依赖、启动先后的问题。

例如下面容器会先启动 redis 和 db 两个服务,最后才启动 web 服务:

version: ''3''
    services:
      web:
        build: .
        depends_on:
          - db
          - redis
      redis:
        image: redis
      db:
        image: postgres

9.ports

端口映射映射主机端口到容器端口

ports:
 - "3000"
 - "3000-3005"
 - "8000:8000"
 - "9090-9091:8080-8081"
 - "49100:22"
 - "127.0.0.1:8001:8001"
 - "127.0.0.1:5000-5010:5000-5010"
 - "6060:6060/udp"
 - "12400-12500:1240"

10.expose

开放这个服务(容器)的端口

expose:
 - "3000"
 - "8000"

 

11.links

较为传统的link,连接本compose文件中的其他容器

web:
  links:
   - "db"
   - "db:database"
   - "redis"

  

12.external_links

扩展连接link,连接非本compose文件的其他容器,就像docker的--link,用来连接公共服务容器,比如说数据库。

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

  

 13.networks

由于--link一直说要被淘汰,建议使用network方式配置,类似于docker run --net模式

这个是网络的主配置。

services:
  some-service:
    networks:
     - some-network
     - other-network
networks:
  some-network:
  other-network:

  

注意:

在networks中声明的网络名称,会自从生成为  Folder_some-network      Folder_other-network,即在你设定的网络名称前面加上当前文件夹名,如果想有互相连通的compose,就把yaml放一个文件夹吧,然后使用docker-compose - ***.yaml [command]

如:

 

14.ALIASES

别名,网络中的别名,可以理解为计算机名。可以同时又多个别名。

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
         - alias3
      other-network:
        aliases:
         - alias2

  

下面示例展示了3个容器,使用两个网络进行互联的配置。

version: ''2''

services:
  web:
    build: ./web
    networks:
      - new

  worker:
    build: ./worker
    networks:
      - legacy

  db:
    image: mysql
    networks:
      new:
        aliases:
          - database
      legacy:
        aliases:
          - mysql

networks:
  new:
  legacy:

  

15.environment

环境变量也就是docker run -e

environment:
  RACK_ENV: development
  SHOW: ''true''
  SESSION_SECRET:963852741

environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET:963852741

  

16.volumes

卷映射,目录映射,可以:ro 设置为只读

 

volumes:
  # 仅创建目录到宿主机
  - /var/lib/mysql

  # 创建真实路径到映射
  - /opt/data:/var/lib/mysql

  # 从compose文件创建相对目录的映射
  - ./cache:/tmp/cache

  # 在linux用户目录创建映射
  - ~/configs:/etc/configs/:ro

  # 在目录空间中创建
  - datavolume:/var/lib/mysql

 17.restart

restart 选项,有下面几种

restart: "no"  #从不
restart: always  #总是
restart: on-failure  #失败时
restart: unless-stopped #除非停止

 

18.privileged

privileged选项

privileged: true

19.deploy

v3版本新加的参数,部署参数。有什么CPU限制,内存限制………………

因为deploy在使用的时候,有一些限制,但你的compose文件中出现如下配置项时,deploy就无法使用:

    build
    cgroup_parent
    container_name
    devices
    tmpfs
    external_links
    links
    network_mode
    restart
    security_opt
    stop_signal
    sysctls
    userns_mode

 

官方文档才是最新最全的。

https://docs.docker.com/compose/compose-file/

五:实例

1.mariadb

 mariadb.yaml

version: "3" #版本3
services: #服务
  mysql:   #服务名mysql
    image: mariadb   #镜像名称
    privileged: true  #高级权限
    tty: true         #开一个终端
    container_name: mysql  #自定义容器名
    networks:       #网络
    - mynet         #属于网络mynet
    ports:          #开放端口映射3306-->3306
    - 3306:3306     #冒号左边是宿主机开放端口,冒号右边是容器开放端口
    environment:    #启动变量
      MYSQL_ROOT_PASSWORD:123456    #mysql的root密码
    volumes:        #目录映射
    - /storage/mariadb:/var/lib/mysql   #映射mariadb的数据库文件存储路径,冒号左边是宿主机路径,冒号右边是容器内路径
networks:  #关于网络的服务
  mynet:   #声明网络mynet

  

2.wordpress

wordpress.yaml

version: "3"   #版本3
services:      #服务
  wordpress:  #服务名wordpress
    image: wordpress #镜像名称
    privileged: true #高级权限
    tty: true    #开一个终端
    container_name: wordpress   #自定义容器名
    networks:  #网络
    - mynet    #属于网络mynet
    ports:     #开放端口映射80-->80
    - 80:80    ##冒号左边是宿主机开放端口,冒号右边是容器开放端口
    environment:  #启动变量mysql的root密码
      WORDPRESS_DB_HOST: mysql   #数据库服务器地址,直接用了另一个容器的容器名
      WORDPRESS_DB_NAME: wordpress   #数据库的库名
      WORDPRESS_DB_USER: wordpress   #数据库的用户名
      WORDPRESS_DB_PASSWORD: wordpress  #数据库的密码
    volumes:    #目录映射
    - /storage/wordpress:/var/www/html/wp-content   #映射wordpress存储路径(插件,主题,语言包,上传文件),冒号左边是宿主机路径,冒号右边是容器内路径
networks:  #关于网络的服务
  mynet:   #声明网络mynet

  

3.使用方法

docker-compose -f mariadb.yaml up -d

#后台启动mariadb容器

#使用任意管理工具,连接3306端口,创建给wordpress用的数据库,库名:wordpress,用户名wordpress,密码wordpress,%(任意)主机登录

docker-compose - wordpress.yaml up -d

#后台启动wordpress容器。

由网络mynet来进行两个容器的自动联通。

8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署

8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署

 

  这一篇继续完善webnotebook,如果你读过上一篇的内容,你应该知道怎么去挂载webnotebook日志和容器的远程访问,但是这些还远不够,webnotebook

总要和一些数据库打交道吧,比如说mysql,mongodb,redis,通常情况下这些存储设备要么是以容器的方式承载,要么是由DBA在非容器环境下统一管理。

 

一:webnotebook连接容器redis

       我们做一个小案例,把网站的所有PV记录到redis中,webnotebook前端显示当前你是 xxx 位用户,案例不重要,重要的是怎么去实现容器互联。

 

      在docker hub 上去找redis的官方镜像,具体redis该如何合理配置这里我就不管了,用最简单的一条docker run 跑起来再说。

[root@localhost data]# docker run --name some-redis -d redis
Unable to find image ''redis:latest'' locally
latest: Pulling from library/redis
6ae821421a7d: Pull complete 
e3717477b42d: Pull complete 
8e70bf6cc2e6: Pull complete 
0f84ab76ce60: Pull complete 
0903bdecada2: Pull complete 
492876061fbd: Pull complete 
Digest: sha256:dd5b84ce536dffdcab79024f4df5485d010affa09e6c399b215e199a0dca38c4
Status: Downloaded newer image for redis:latest
ed07890700a5cdb7d737a196c28009a9d1b08de35f55d51f53c80e6cfe6ba199
[root@localhost data]# 
[root@localhost data]# 
[root@localhost data]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
ed07890700a5        redis               "docker-entrypoint.s…"   About a minute ago   Up About a minute   6379/tcp            some-redis

    

    接下来安装 StackExchange.Redis,在Index这个Action中将当前的访问作为一个PV记录到redis中,不过下面的代码要注意一点的就是,为了去访问redis,

这里我采用了redis.webnotebook.com 去映射到redis容器的ip,映射关系可以在创建容器的时候自动追加到 /etc/hosts 中,每一次访问都执行一次Increment自

增操作。

public class HomeController : Controller
    {
        public static Logger logger = LogManager.GetLogger("SimpleDemo");
        public static ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("redis.webnotebook.com:6379");

        /// <summary>
        /// 读取mongodb数据数据
        /// </summary>
        /// <returns></returns>
        public IActionResult Index()
        {
            var db = redis.GetDatabase();

            var num = db.StringIncrement("count");

            ViewData["num"] = num;

            return View();
        }
    }

   

     在UI上,展示下你当前是多少位访客,就是这样。

<div class="text-center">
    <h1 class="display-4">您是当前 @ViewData["num"]  位访客</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

     

     然后你就可以docker build,完了之后docker run时通过 --link  some-redis:redis.webnotebook.com  去指定一下就好了,some-redis是redis容器的名字,

redis.webnotebook.com 是这个some-redis别名,这样就方便的实现了 redis.webnotebook.com和容器ip的映射关系。

[root@localhost publish]# docker run -d --name webnotebook -p 8080:8080 --link some-redis:redis.webnotebook.com huangxincheng/webnotebook:v1
b931e040de26c4bfc0b49cbc8e626cdcb30ad9bdff523f623c0a2d6c50899a81
[root@localhost publish]# 
[root@localhost publish]# 
[root@localhost publish]# docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                    NAMES
b931e040de26        huangxincheng/webnotebook:v1   "dotnet WebNotebook.…"   2 seconds ago       Up 2 seconds        0.0.0.0:8080->8080/tcp   webnotebook
ed07890700a5        redis                          "docker-entrypoint.s…"   27 minutes ago      Up 27 minutes       6379/tcp                 some-redis

       有些人可能就好奇了,到底webnotebook容器内的/etc/hosts真的修改了吗? 接下来你可以通过 docker exec 到webnotebook容器去看一下就好啦,

从下面标红的地方可以看到,172.17.0.2 已经和 xxx.com 做了映射。

[root@localhost publish]# docker exec -it webnotebook /bin/bash
root@b931e040de26:/data# 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
172.17.0.2    redis.webnotebook.com ed07890700a5 some-redis
172.17.0.3    b931e040de26
root@b931e040de26:/data#

 

     回到文章开头的问题,如果redis是在远程宿主机上部署的,那我的webnotebook容器该怎么访问呢?你可能会说,直接通过ip访问即可,但是为了保持

统一性,我还是希望通过redis.webnotebook.com 这个域名进行访问,也就是说怎么去把这个映射关系追加到容器中呢?可以使用-- add-host来实现。

[root@localhost publish]#  docker run -d --name webnotebook -p 8080:8080 --add-host redis.webnotebook.com:172.17.0.2 huangxincheng/webnotebook:v1
91e7d9c1b575cc34ae98eebfc437d081b852f450104e2b368f898299852b0f18
[root@localhost publish]# docker exec -it webnotebook /bin/bash
root@91e7d9c1b575:/data# 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
172.17.0.2    redis.webnotebook.com
172.17.0.3    91e7d9c1b575
root@91e7d9c1b575:/data#

   

二:docker-compose 容器编排

      目前我们仅引入了redis,这样有了两个容器,但随着业务的增加,你可能还需要mysql,ssdb,rabbitmq,nginx等服务,而docker建议的就是一个容器

一个进程,那为了能顺利承载这些服务,你可能需要部署6个容器,如果你还是按照老一套的方法一个一个的去部署,操作起来就比较乱,有没有一种方式可

以让docker自动帮我们一键部署好这些容器呢? 就好像dockerfile那样自动化部署,当然有了,那就是docker-compose 容器编排。

 

1. 安装

    官网地址:https://docs.docker.com/compose/install/#install-compose  然后按照步骤一步一步来就好了,最后通过docker-compose --version 看一下即可。

[root@localhost publish]# sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[root@localhost publish]# sudo chmod +x /usr/local/bin/docker-compose
[root@localhost publish]# docker-compose --version
docker-compose version 1.22.0, build f46880fe
[root@localhost publish]#

 

2. 编写docker-compose 

    docker-compose的所有命令都在 https://docs.docker.com/compose/compose-file/  上面找得到,如果有兴趣可以查看一下。

version: ''3.0''
services:
  webnotebook:
    container_name: webnotebook
    build: 
      context: .
      dockerfile: ./Dockerfile
    depends_on:
      - redis
    links:
      - "redis:redis.webnotebook.com"
    ports:
      - "8080:8080"
  redis:
   container_name: some-redis
   image: redis

 

   上面的配置看起来不难吧,如果不知道参数的意思,还是那句话,查看官方文档, 最后你可以使用 docker-compose up --build 跑起来,或者使用 -d 参数

进行后台运行。

[root@localhost publish]# docker-compose up --build
Building webnotebook
Step 1/9 : FROM microsoft/dotnet:2.2-aspnetcore-runtime
 ---> dad26d192ae6
Step 2/9 : ENV TZ Asia/Shanghai
 ---> Using cache
 ---> 72535a350c5d
Step 3/9 : LABEL author hxc@qq.com
 ---> Using cache
 ---> d4dcb4ba06aa
Step 4/9 : RUN mkdir /data
 ---> Using cache
 ---> 6bbfc1537e42
Step 5/9 : COPY ./ /data
 ---> Using cache
 ---> 5401b74ec21f
Step 6/9 : WORKDIR /data
 ---> Using cache
 ---> d93e7949b527
Step 7/9 : VOLUME /data/log
 ---> Using cache
 ---> 39c4285c6d6c
Step 8/9 : EXPOSE 8080
 ---> Using cache
 ---> d02932ddfbcc
Step 9/9 : CMD [ "dotnet","WebNotebook.dll" ]
 ---> Using cache
 ---> 0572ceea51a1
Successfully built 0572ceea51a1
Successfully tagged publish_webnotebook:latest
Starting some-redis ... done
Starting webnotebook ... done
Attaching to some-redis, webnotebook
some-redis     | 1:C 22 Feb 2019 09:11:03.160 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
some-redis     | 1:C 22 Feb 2019 09:11:03.160 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=1, just started
some-redis     | 1:C 22 Feb 2019 09:11:03.160 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
some-redis     | 1:M 22 Feb 2019 09:11:03.161 * Running mode=standalone, port=6379.
some-redis     | 1:M 22 Feb 2019 09:11:03.161 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
some-redis     | 1:M 22 Feb 2019 09:11:03.161 # Server initialized
some-redis     | 1:M 22 Feb 2019 09:11:03.161 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ''vm.overcommit_memory = 1'' to /etc/sysctl.conf and then reboot or run the command ''sysctl vm.overcommit_memory=1'' for this to take effect.
some-redis     | 1:M 22 Feb 2019 09:11:03.161 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command ''echo never > /sys/kernel/mm/transparent_hugepage/enabled'' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
some-redis     | 1:M 22 Feb 2019 09:11:03.161 * Ready to accept connections
webnotebook    | : Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[0]
webnotebook    |       User profile is available. Using ''/root/.aspnet/DataProtection-Keys'' as key repository; keys will not be encrypted at rest.
webnotebook    | Hosting environment: Production
webnotebook    | Content root path: /data
webnotebook    | Now listening on: http://[::]:8080
webnotebook    | Application started. Press Ctrl+C to shut down.

非常简单吧,只要我有一个docker-comose文件就可以实现一键部署,好了,希望本篇对你有帮助。

 

原文出处:https://www.cnblogs.com/huangxincheng/p/10419632.html

Docker - 03 编排容器 Docker Compose 指令速查表

Docker - 03 编排容器 Docker Compose 指令速查表

docker

目录

  • 01 Docker 常用指令、参数配置速查表
  • 02 Dockerfile 指令速查表
  • 03 Docker Compose 指令速查表

Docker - 03 编排容器 Docker Compose 指令速查表

1 docker-compose CLI 命令

1.1 主要

 命令 说明 使用
up 创建并运行作为服务的容器 ducafecat_2018-08-16-11-42-05
down 停止服务容器并清除 ducafecat_2018-08-16-11-42-33

1.2 其它

 命令 说明 使用
bind build需要的镜像 build [options] [--build-arg key=val...] [SERVICE...]
config 验证脚本 config [options]
create 创建镜像不启动 create [options] [SERVICE...]
events 监听容器事件 events [options] [SERVICE...]
exec 执行指定容器执行程序 exec [options] [-e KEY=VAL...] SERVICE COMMAND [ARGS...]
run 运行容器一次性的程序 run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] [-l KEY=VALUE...] SERVICE [COMMAND] [ARGS...]
kill 强行停止服务 kill [options] [SERVICE...]
pause 暂停服务 pause [SERVICE...]
unpause 恢复被暂停的服务 unpause [SERVICE...]
stop 停止运行一个服务的所有容器 stop [options] [SERVICE...]
start 启动运行某个服务的所有容器 start [SERVICE...]
restart 重启某个服务的所有容器 restart [options] [SERVICE...]
rm 删除停止的服务(容器) rm [options] [SERVICE...]
logs 展示service的日志 logs [options] [SERVICE...]
top 容器资源占用 top [SERVICE...]
ps 容器列表 ps [options] [SERVICE...]
port 查看服务中的端口被映射到了宿主机的哪个端口上 port [options] SERVICE PRIVATE_PORT
pull 拉取服务依赖的镜像 pull [options] [SERVICE...]
push 提交镜像 push [options] [SERVICE...]
bundle 打包 DAB 文件 bundle [options]
scale 指定某一个服务启动的容器的个数 scale [SERVICE=NUM...]

2 docker-compose 指令速查表

按字母排列

命令 说明 用法
build 编译Dockerfile生成镜像 ducafecat_2018-08-16-10-59-07
command 覆盖容器启动后默认执行的命令 ducafecat_2018-08-16-10-59-36
container_name 容器的名字 ducafecat_2018-08-16-10-59-52
cap_add,cap_drop 加入或者去掉容器能力 ducafecat_2018-08-15-18-18-29
depends_on 容器的依赖 ducafecat_2018-08-16-11-00-51
configs 导入配置 ducafecat_2018-08-16-11-01-17
dns 设置DNS ducafecat_2018-08-16-11-02-46
dns_search 自定义DNS搜索范围 ducafecat_2018-08-16-11-04-10
devices 设备映射列表 ducafecat_2018-08-16-11-04-29
driver_opts 给驱动传值 ducafecat_2018-08-16-11-05-25
entrypoint 指定接入点 ducafecat_2018-08-16-11-08-49
env_file 导入环境变量文件 ducafecat_2018-08-16-11-09-15
environment 设置环境变量 ducafecat_2018-08-16-11-09-34
expose 暴露的端口 ducafecat_2018-08-16-11-09-50
external_links 连接单独启动的容器 ducafecat_2018-08-16-11-10-07
extra_hosts 修改 /etc/hosts ducafecat_2018-08-16-11-10-25
healthcheck 检查状态 ducafecat_2018-08-16-11-10-57
image 镜像 ducafecat_2018-08-16-11-13-55
labels 向容器添加元数据 ducafecat_2018-08-16-11-14-20
links 连接容器 ducafecat_2018-08-16-11-15-38
logging 配置日志服务 ducafecat_2018-08-16-11-16-42ducafecat_2018-08-16-11-16-53
network_mode 网络模式 ducafecat_2018-08-16-11-17-10
networks 加入指定网络 ducafecat_2018-08-16-11-17-24
pid 跟主机系统共享进程命名空间 ducafecat_2018-08-16-11-33-03
ports 映射端口 ducafecat_2018-08-16-11-18-48ducafecat_2018-08-16-11-19-01
restart 出错重启方式 ducafecat_2018-08-16-11-18-04
stop_signal 设置另一个信号来停止容器 ducafecat_2018-08-16-11-30-54
tmpfs 挂载临时目录到容器内部 ducafecat_2018-08-16-11-31-11
volumes 挂载一个目录 ducafecat_2018-08-16-11-31-43

3 例子 - 运行容器服务 WordPress

  • 编写 docker-compose.yml
version: ''3.3''

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:
  • 运行 docker-compose up

参考

  • docker-compose CLI
  • Docker Compose
  • Get started with WordPress
  • Compose file version 3 reference

© 会煮咖啡的猫咪

Docker Compose 和 Docker Swarm 和 Docker Service

Docker Compose 和 Docker Swarm 和 Docker Service

Docker Compose

介绍

通过yml文件配置,高效管理多个docker,启停

中文文档

https://www.jb51.cc/manual/view/36129.html

安装

# 慢
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 国内镜像
$ sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

授权文件

$ sudo chmod +x /usr/local/bin/docker-compose

测试

$ docker-compose --version
docker-compose version 1.27.4, build 1110ad01

卸载

sudo rm /usr/local/bin/docker-compose

测试使用(官方给的)

1创建文件夹

$ mkdir composetest
$ cd composetest

2写测试程序Python。app.py

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

3创建py文件依赖文件requirements.txt

flask
redis

4创建Dockerfile文件

FROM python:3.7-alpine
workdir /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
copY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
copY . .
CMD ["flask", "run"]

5创建docker-compose.yml

# version: "3.9" 需要版本对应
version: "3"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

6使用Compose构建并运行应用程序

docker-compose up
# 后台运行
# docker-compose up -d

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-87feppxX-1608950922543)(C:\Users\admin\AppData\Local\Temp\1608866566146.png)]

  1. docker images 自动下载依赖镜像
  2. 默认服务名: 文件名 _ 服务名 _ num(集群副本数量)
  3. 创建docker compose自己默认网络,并将所有启动的容器添加到网络中
  4. 在同一网络下可以直接使用域名访问

停止

# 前端运行使用 ctrl + c 停止
# 后台运行使用
docker-compose stop

yml文件规则

version: "3" # docker-compose核心版本
services: # 服务
	fw: # 服务名称
		image: redis # 服务配置
		ports: # 服务配置2
      		- "5000:5000"
      	depends_on: # 依赖(启动顺序)
      		- fw2
      		- redis
      	..... # 容器启动的所有配置
	fw2: 
		image: # 服务配置

官方文档 https://docs.docker.com/compose/compose-file/compose-file-v2/

测试开源程序(官方给的)

创建工作文件夹 my_wordpress/

创建docker-compose.yml

version: '3.3'

services:
   db:
     image: MysqL:5.7
     volumes:
       - db_data:/var/lib/MysqL
     restart: always
     environment:
       MysqL_ROOT_PASSWORD: somewordpress
       MysqL_DATABASE: wordpress
       MysqL_USER: wordpress
       MysqL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       wordpress_DB_HOST: db:3306
       wordpress_DB_USER: wordpress
       wordpress_DB_PASSWORD: wordpress
       wordpress_DB_NAME: wordpress
volumes:
    db_data: {}

后台运行

docker-compose up -d

Docker Swarm

  • 集群
  • 必须有两个或两个以上主节点才能运行

Swarm mode cluster

[root@centos3 ~]# docker swarm --help

Usage:  docker swarm COMMAND

Manage Swarm

Commands:
  ca          管理根CA
  init        初始化集群
  join        加入集群
  join-token  创建加入令牌
  leave       离开集群
  unlock      解锁群
  unlock-key  管理解锁密钥
  update      更新集群

Run 'docker swarm COMMAND --help' for more information on a command.

1初始化一个集群

docker swarm init [OPTIONS]
名字,简写默认描述
–advertise-addr通告地址(格式:<ip | interface>:端口)
–autolock启用管理器自动锁定(需要解锁密钥才能启动停止的管理器)
–availabilityactive节点的可用性(“活动”|“暂停”|“漏”)
–cert-expiry2160h0m0s节点证书的有效期(ns | us | ms | s | m | h)
–data-path-addr用于数据路径流量的地址或接口(格式:<ip | interface>)
–dispatcher-heartbeat5S调度员心跳周期(ns | us | ms | s | m | h)
–external-ca一个或多个证书签名端点的规格
–force-new-cluster强制从当前状态创建一个新的群集
–listen-addr0.0.0.0:2377监听地址(格式:<ip | interface>:端口)
–max-snapshots0要保留的附加木筏快照的数量
–snapshot-interval10000Raft快照之间的日志条目数
–task-history-limit5任务历史保留限制
# 初始化集群
docker swarm init --advertise-addr 192.168.0.191

2加入一个节点

docker swarm join [OPTIONS] HOST:PORT
名字,简写默认描述
–advertise-addr通告地址(格式:<ip | interface>:端口)
–availabilityactive节点的可用性(“活动”|“暂停”|“漏”)
–data-path-addr用于数据路径流量的地址或接口(格式:<ip | interface>)
–listen-addr0.0.0.0:2377监听地址(格式:<ip | interface>:端口)
–token进入群的令牌
# 例如加入一个节点
# 令牌SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2
docker swarm join --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2 192.168.0.191:2377

3获取令牌

docker swarm join-token [OPTIONS] (worker|manager)
# 工作令牌
docker swarm join-token worker
# 管理令牌
docker swarm join-token manager

查看节点

# 查看节点
docker node

Docker Service

docker service COMMAND
命令描述
docker service create创建一项新服务
docker service inspect显示一项或多项服务的详细信息
docker service logs获取服务或任务的日志
docker service ls列出服务
docker service ps列出一项或多项服务的任务
docker service rm删除一项或多项服务
docker service scale扩展一个或多个复制服务
docker service update更新服务

1创建服务

docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
名字,简写默认描述
–config指定配置以暴露给服务
–constraint展示位置限制
–container-label容器标签
–credential-spec托管服务帐户的凭证规范(仅限Windows)
–detach,-d真正立即退出,而不是等待服务收敛
–dns设置自定义DNS服务器
–dns-option设置DNS选项
–dns-search设置自定义DNS搜索域
–endpoint-mode要人端点模式(vip或dnsrr)
–entrypoint覆盖图像的默认入口点
–env,-e设置环境变量
–env-file读入环境变量文件
–group为容器设置一个或多个补充用户组
–health-cmd运行以检查运行状况的命令
–health-interval运行检查之间的时间(ms | s | m | h)
–health-retries0需要报告不健康的连续失败
–health-start-period在重新计数到不稳定(ms | s | m | h)之前,容器初始化的开始时间段
–health-timeout允许一次检查运行的最长时间(ms | s | m | h)
–host设置一个或多个自定义主机到IP映射(主机:IP)
–hostname容器主机名
–label, -l服务标签
–limit-cpu限制cpu
–limit-memory0限制记忆
–log-driver记录驱动程序的服务
–log-OPT记录驱动程序选项
–mode复制服务模式(复制或全局)
–mount将文件系统挂载附加到服务
–name服务名称
–network网络附件
–no-healthcheck禁用任何容器指定的HEALTHCHECK
–no-resolve-image不要查询注册表来解析图像摘要和支持的平台
–placement-PREF添加展示位置首选项
–publish,-p将端口发布为节点端口
–quiet,-q抑制进度输出
–read-only将容器的根文件系统挂载为只读
–replicas任务数量
–reserve-cpu预留cpu
–reserve-memory0保留内存
–restart-condition满足条件时重新启动(“none”|“on-failure”|“any”)(默认为“any”)
–restart-delay重启尝试之间的延迟(ns | us | ms | s | m | h)(默认5秒)
–restart-max-attempts放弃前的最大重启次数
–restart-window用于评估重新启动策略的窗口(ns | us | ms | s | m | h)
–rollback-delay0任务回滚之间的延迟(ns | us | ms | s | m | h)(默认值为0)
–rollback-failure-action回滚失败的操作(“暂停”|“继续”)(默认“暂停”)
–rollback-max-failure-ratio0在回滚期间容忍的失败率(默认0)
–rollback-monitor0(ns | us | ms | s | m | h)(默认5秒)每个任务回滚之后的持续时间
–rollback-order回滚顺序(“start-first”|“stop-first”)(默认“stop-first”)
–rollback-parallelism1同时回滚的任务的最大数量(0一次全部回滚)
–secret指定泄露给服务的秘密
–stop-grace-period强制杀死一个容器之前等待的时间(ns | us | ms | s | m | h)(默认10秒)
–stop-signal停止容器的信号
–tty, -t分配一个伪TTY
–update-delay0更新之间的延迟(ns | us | ms | s | m | h)(默认为0)
–update-failure-action更新失败的操作(“暂停”|“继续”|“回滚”)(默认“暂停”)
–update-max-failure-ratio0更新期间容许的失败率(默认0)
–update-monitor0(ns | us | ms | s | m | h)(默认5秒)每个任务更新后的持续时间
–update-order更新顺序(“start-first”|“stop-first”)(默认为“stop-first”)
–update-parallelism1同时更新的最大任务数(0个一次全部更新)
–user,-u用户名或UID(格式:<名称| uid>:<组| gid>)
–with-registry-auth向注册代理发送注册表认证详细信息
–workdir,-w容器内的工作目录
# 例如,启动一个Nginx服务,暴露8080端口
docker service create -p 8080:80 --name Nginx01 Nginx
# docker run 容器启动,单机版本
# docker service 服务启动,支持扩缩容器
# 查看服务
docker service ps Nginx01
# 查看副本
docker service ls
# 查看详情
docker service inspect Nginx01

2更新服务

docker service update [OPTIONS] SERVICE
名字,简写默认描述
–args服务命令参数
–config-add添加或更新服务上的配置文件
–config-RM删除配置文件
–constraint-add添加或更新展示位置约束
–constraint-RM删除约束
–container-label-add添加或更新容器标签
–container-label-rm用钥匙取出容器标签
–credential-spec托管服务帐户的凭证规范(仅限Windows)
–detach,-d立即退出,而不是等待服务收敛
–dns-add添加或更新自定义DNS服务器
–dns-option-add添加或更新DNS选项
–dns-option-rm删除一个DNS选项
–dns-rm删除自定义的DNS服务器
–dns-search-add添加或更新自定义DNS搜索域
–dns-search-rm删除一个DNS搜索域
–endpoint-mode端点模式(vip或dnsrr)
–entrypoint覆盖图像的默认入口点
–env-add添加或更新环境变量
–env-RM删除一个环境变量
–force即使没有更改需要,也强制更新
–group-add向容器添加一个附加的补充用户组
–group-RM从容器中删除先前添加的补充用户组
–health-cmd运行以检查运行状况的命令
–health-interval运行检查之间的时间(ms | s | m | h)
–health-retries0需要报告不健康的连续失败
–health-retries在重新计数到不稳定(ms | s | m | h)之前,容器初始化的开始时间段
–health-timeout允许一次检查运行的最长时间(ms | s | m | h)
–host加添加或更新自定义主机到IP映射(主机:IP)
–host-RM删除自定义的主机到IP映射(主机:IP)
–hostname容器主机名
–image服务图片标签
–label-add添加或更新服务标签
–label-RM用钥匙去除标签
–limit-cpu限制cpu
–limit-memory0限制记忆
–log-driver记录驱动程序的服务
–log-OPT记录驱动程序选项
–mount-add添加或更新服务上的装载
–mount-RM通过目标路径移除一个安装
–network加添加一个网络
–network-RM删除网络
–no-healthcheck禁用任何容器指定的HEALTHCHECK
–no-resolve-image不要查询注册表来解析图像摘要和支持的平台
–placement-PREF-ADD添加展示位置首选项
–placement-PREF-RM删除展示位置偏好设置
–publish相加添加或更新已发布的端口
–publish-RM通过目标端口删除发布的端口
–quiet,-q抑制进度输出
–read-only将容器的根文件系统挂载为只读
–replicas任务数量
–reserve-cpu预留cpu
–reserve-memory0保留内存
–restart-condition条件满足时重新启动(“none”|“on-failure”|“any”)
–restart-delay重启尝试之间的延迟(ns | us | ms | s | m | h)
–restart-max-attempts放弃前的最大重启次数
–restart-window用于评估重新启动策略的窗口(ns | us | ms | s | m | h)
–rollback回退到先前的规范
–rollback-delay0任务回滚之间的延迟(ns | us | ms | s | m | h)
–rollback-failure-action回滚失败的操作(“暂停”|“继续”)
–rollback-max-failure-ratio0在回滚期间容忍的失败率
–rollback-monitor0每个任务回滚后监视失败的持续时间(ns | us | ms | s | m | h)
–rollback-order回滚顺序(“start-first”|“stop-first”)
–rollback-parallelism0同时回滚的任务的最大数量(0一次全部回滚)
–secret-add添加或更新服务的秘密
–secret-RM去掉一个秘密
–stop-grace-period强制杀死一个容器之前的等待时间(ns | us | ms | s | m | h)
–stop-signal停止容器的信号
–tty, -t分配一个伪TTY
–update-delay0更新之间的延迟(ns | us | ms | s | m | h)
–update-failure-action更新失败的操作(“暂停”|“继续”|“回滚”)
–update-max-failure-ratio0更新期间容错的失败率
–update-monitor0(ns | us | ms | s | m | h)每个任务更新后的持续时间
–update-order更新顺序(“start-first”|“stop-first”)
–update-parallelism0同时更新的最大任务数(0个一次全部更新)
–user,-u用户名或UID(格式:<名称| uid>:<组| gid>)
–with-registry-auth向注册代理发送注册表认证详细信息
–workdir,-w容器内的工作目录
# 为 Nginx01 创建 10 个副本
docker service update --replicas 10 Nginx01 
# 或 使用 scale 命令
docker service scale Nginx01=10

移除服务

docker service rm Nginx01

docker compose容器互联

docker compose容器互联

使用docker-compose编排容器时,如容器之间需要互相通信,使用本地连接,需要使用容器名来代替localhost

"connection": "postgresql+psycopg2://postgres:123456@localhost/database"

连接串中的localhost需要替换成postgresql容器名

version: ''3''

services:
  db:
    build: ./db
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=123456
      - POSTGRES_DB=database
    volumes:
      - ./db/init:/docker-entrypoint-initdb.d/
    container_name: db
    restart: always
    ports:
      - "5432:5432"
  web:
    build: ./web
    restart: always
    volumes:
      - ./web/codes:/code
    ports:
      - "80:8080"
    links:
      - db
    depends_on:
      - db
    container_name: web

"connection": "postgresql+psycopg2://postgres:123456@db/database"

 

我们今天的关于docker-compose docker启动工具,容器互联docker-compose启动命令的分享就到这里,谢谢您的阅读,如果想了解更多关于8天入门docker系列 —— 第五天 使用aspnetcore小案例熟悉容器互联和docker-compose一键部署、Docker - 03 编排容器 Docker Compose 指令速查表、Docker Compose 和 Docker Swarm 和 Docker Service、docker compose容器互联的相关信息,可以在本站进行搜索。

本文标签: