docker常用功能及命令

young 486 2022-04-19

Docker命令

镜像基本命令

本地镜像列表

docker images
docker images
REPOSITORY                        TAG       IMAGE ID       CREATED         SIZE
gateway_credit-api-gateway        latest    38221a08742a   3 days ago      580MB
test-image                        1.0       38221a08742a   3 days ago      580MB
  • REPOSITORY:表示镜像的仓库源

  • TAG:镜像的标签,同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本

  • IMAGE ID:镜像的ID,所有镜像都是通过一个 64 位十六进制字符串 (内部是一个 256 bit 的值)来标识的。 为简化使用,前 12 个字符可以组成一个短ID,可以在命令行中使用。短ID还是有一定的 碰撞机率,所以服务器总是返回长ID。

  • CREATED:镜像的创建时间

  • SIZE:镜像的大小

参数:

  • -a 所有镜像,包括隐藏镜像
  • -q 只显示镜像id

镜像搜索

镜像搜索可以通过官方的hub.docker.com或者私有的docker仓库,也可以通过命令镜像搜索

# 查找mysql的镜像
docker search mysql
  • NAME:镜像仓库源的名称
  • DESCRIPTION:镜像的描述
  • OFFICIAL:是否 docker 官方发布
  • STARS:类似 Github 里面的 star,表示点赞、喜欢的意思。
  • AUTOMATED:自动构建

参数

  • -f 搜索过滤条件
docker search mysql -f=stars=3000

下载镜像

docker pull [OPTIONS] NAME:[TAG|@DIGEST]

options参数

  • -a 拉取所有tagged镜像
  • --disable-content-trust 忽略镜像校验,默认开启

如果不指定tag,将拉取最新的镜像latest

删除镜像

通过名字删除

docker rmi -f mysql

参数:

  • -f 强制删除

通过镜像ID删除

docker rmi -f 8b43c6af2ad0 

删除多个镜像时,镜像ID用空格隔开

# 删除所有镜像
docker rmi -f $(docker images -aq)

当要删除的镜像中有正在运行的容器时,需要先删除容器

容器基本命令

下载镜像

docker pull centos:centos7

创建并运行容器

docker run [options] IMAGE [COMMAND] [ARG...]

options参数:

可以通过docker run --help 查看

  • -a stdin 指定标准输入输出内容,可选STDIN/STDOUT/STDERR
  • -d 后台运行容器,并返回容器ID
  • -i 以交互模式运行容器,常与-t同时使用
  • -P 随机端口映射,容器内部端口随机映射到主机端口
  • -p 指定端口映射,格式为宿主机端口:容器端口,表示宿主机端口映射到容器端口
  • -t 为容器重新分配一个伪输入终端,常与-i同时使用
  • --name="tomcat0" 为容器指定一个名称
  • --dns 8.8.8.8 指定容器使用的DNS服务器,默认与宿主机一致
  • --dns-search example.com 指定容器DNS搜索域名,默认与宿主机一致
  • -h "host" 指定容器的hostname
  • -e username="young" 设置环境变量
  • --env-file=[] 从指定文件读取环境变量
  • --cpuset="0-2" /--cpuset="0,1,2" 绑定容器到指定的cpu运行
  • -m 设置容器使用最大内存
  • --network 指定网络命名空间
  • --link=[] 添加链接到另一个容器
  • -v 绑定目录
docker run -it centos:centos7 /bin/bash
[root@d789c772084d /]#

参数说明

  • -i 交互式操作
  • -t 终端
  • centos:centos7 镜像名称
  • /bin/bash 命令,表示希望有个交互式shell

退出交互,直接输入exit

[root@d789c772084d /]# exit
exit

查看正在运行的容器

# 让centos镜像在后端运行
docker run -d centos:centos7
# 返回容器ID
47b000b20292425c6af4daa85b32c703ed93df3ff38d44216d2217dcd3f4e88a

docker ps
CONTAINER ID   IMAGE            COMMAND       CREATED         STATUS         PORTS     NAMES
26367e0362de   centos:centos7   "/bin/bash"   2 minutes ago   Up 2 minutes             loving_roentgen

可选参数

  • -a 查询历史运行过的容器
  • -n 只显示最近创建的n个容器
  • -q 只显示容器的编号

退出容器

# 运行容器
docker run -it centos:centos7 bash

exit 退出并停止容器

ctrl+Q+P 退出但是不停止容器

删除容器

docker rm [OPTIONS] CONTAINER [CONTAINER...] 

options参数

  • -f 强制停止删除一个运行中的容器
  • -l 移除容器间的网络连接而非容器本身
  • -v 删除与容器有关的卷

容器启动与停止

# 启动一个或多个已经被停止的容器
docker start containerID
# 重启容器
docker restart containerID
# 停止运行中的容器
docker stop containerID
# 强制停止运行中的容器
docker stop -q containerID

常用命令

后台启动

docker run -d 镜像名[:版本]

当以后台方式启动容器时,必须有一个前台进程,否则docker容器发现没有应用时,会自动停止

docker run -itd centos:centos7
docker run -d mysql

查看日志

docker logs [OPTIONS] CONTAINER

OPTIONS 参数

  • --detail 显示提供给日志的额外详细信息
  • --follow,-f 跟踪日志输出
  • --since 显示自时间戳(如2021-01-01T12:34:56Z)或者(如42m)以来的日志
  • --tail,-n 默认all。从日志末尾显示的行数,传递负数或非整数时,默认为all
  • --timestamps,-t,显示时间戳
  • --unit 在自时间戳(如2021-01-01T12:34:56Z)或者(如42m)之前的日志
docker logs -f --tail=100 f05c3273a591

查看进程

docker top [OPTIONS] CONTAINER [ps OPTIONS]
docker top e6d4916695b6

查询元数据

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

OPTIONS参数

  • -f 执行返回值的模板文件
  • -s 显示总的文件大小
  • --type 为指定类型返回JSON
docker inspect centos:centos7

在运行的容器中执行命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

OPTIONS参数

  • -d 分离模式,在后台运行
  • -i 保持STDIN打开
  • -t 分配一个伪终端
  • -u user
  • -w workdir

数据拷贝

docker cp 容器ID:容器内路径 宿主机路径

提交镜像

用容器创建一个新的镜像

docker commit [OPTIONS] CONTAINER [RESPOSITORY[:TAG]]

OPTIONS参数

  • -a 提交镜像的坐着
  • -c 使用dockerfile命令来创建镜像
  • -m 提交时的说明文字
  • -p 在commit时暂停容器

Dockerfile

Dockerfile是用来构建镜像的文本文件,文本内容包含了构建指令及说明

Dockerflle命令

指令简介
FROM除了注释,第一行必须是FROM,FROM后面跟镜像名称,表示要基于哪个基础镜像进行构建
RUNRUN后面跟一个具体的命令,类似于Linux命令行执行命令
ADD拷贝本机文件或者远程文件到镜像内,压缩文件会自动解压
COPY拷贝本地文件到镜像内
USER指定容器启动的用户
ENTRYPOINT容器的启动命令
CMDCMD为ENTRYPOINT指令提供默认参数,也可以单数使用CMD指定容器的启动参数
ENV指定容器运行的环境变量,格式为key=value
ARG定义外部变量,构建镜像时可以使用build-arg <varname>=<value>的格式传递参数用户构建
EXPOSE指定容器监听的端口,格式为[port]/tcp或者[port]/udp
WORKDIR为Dockerfile中跟在其后的所有RUN、CMD、ENTRYPOINT、COY和ADD命令设置工作目录
MAINTAINER镜像维护者信息
VOLUME定义匿名数据卷,启动容器时未挂载数据卷,会自动挂载到匿名卷,格式:VOLUME ["<路径1>","<路径2>"...]或者VOLUME <路径>
LABEL用来给镜像添加一些元数据,以键值对的形式

CMD与ENTRYPOINT的区别

CMD为启动的容器指定默认要运行的程序,程序结束,容器也就结束。CMD指令指定的程序可被docker run 命令行参数中指定要运行的程序覆盖。

如果Dockfile中存在多个CMD指令,仅最后一个生效。

ENTRYPOINT类似于CMD指令,但是不会被docker run的命令行参数锁指定的指令覆盖,而且这些命令行参数会被当做参数送给ENTRYPOINT指定指定的程序。

但是,如果运行docker run的时候,使用了--entrypoint选项,将覆盖CMD指令指定的程序。

在执行docker run的时候,可以指定ENTRYPOINT运行所需的参数。

如果docker file中存在多个ENTRYPOINT指令,仅最后一个生效。

Dockerfile构建镜像

hub.docker.com中提供的centos是不支持vim等命令的

尝试构建一个支持vim命令的centos镜像

编写Dockerfile

vim mydockerfile-centos
# 选择基础镜像
FROM centos:centos7
# 作者信息
MAINTAINER young
# 定义环境变量
ENV MYPATH /usr/local
# 指定工作目录
WORKDIR $MYPATH
# 执行指令
RUN yum install -y vim
# 声明端口
EXPOSE 80

CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash

构建Dockerfile

docker build [OPTIONS] PATH | URL | -
docker build -f mydockerfile-centos -t my-centos:1.0 .

常用参数

  • -f 指定要构建的dockerfile文件,如果文件名为Dockerfile则不用指定
  • -t 标签 name:tag

docker网络

linux网卡

查看网卡

  • ip link show
  • ls /sys/class/net
  • ip a

网卡

ip a

状态:UP/DOWN/UNKONW等

link/ether:MAC地址

inet:绑定的ip地址

配置文件

linux中的网卡对应的就是文件

如 cat /etc/sysconfig/network-scripts/ifcfg-eth0

给网卡添加IP地址

可以通过直接修改ifcfg文件,也可以通过命令

# 添加ip
ip addr add 192.188.0.100/24 dev etho
# 删除ip地址
ip addr delete 192.168.0.100/24 dev etho

网卡启动与关闭

重启网卡:service network restart / systemctl restart network

启动/关闭某个网卡 ifup/ifdown eth0 or ip link set eth0 up/down

Network Namespace

Centos 6.5版本开始支持

linux上的网络是通过network namespace来管理的,不同的network namespace是互相隔离的

ip netns list :查看当前机器上的network namespace

# 查看
ip netns list
# 添加
ip netns add ns1
# 删除
ip netns delete ns1

namespace实战

创建一个network namespace

ip netns add ns1

查看该namespace下网卡的情况

ip netns exec ns1 ip a

启动ns1上额lo网卡

ip netns exec ns1 ifup lo
or
ip netns exec ns1 ip link set lo up

再次查看

ip netns exec ns1 ip a

发现state变成了UNKOWN

再创建一个network namespace

ip netns add ns2

此时想让两个namespace网络联通,需要用到 veth pair

veth pair: Virtual Ethernet Pair,是一个成对的端口

创建一对link,也就是要通过veth pair链接的link

ip link add veth-ns1 type veth peer name veth-ns2

查看link情况

ip link
16: veth-ns2@veth-ns1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 36:63:04:34:b2:2a brd ff:ff:ff:ff:ff:ff
17: veth-ns1@veth-ns2: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 9a:15:4a:60:34:aa brd ff:ff:ff:ff:ff:ff

将veth-ns1加入到ns1中,将veth-ns2加入到ns中

ip link set veth-ns1 netns ns1
ip link set veth-ns2 netns ns2

查看服务器和ns1,ns2的link情况

ip link
ip netns exec ns1 ip link
ip netns exec ns2 ip link

此时veth-ns1和veth-ns2还没有ip地址

ip netns exec ns1 ip addr add 192.168.0.11/24 dev veth-ns1
ip netns exec ns1 ip addr add 192.168.0.12/24 dev veth-ns1

再次查看link信息

ip netns exec ns1 ip link
ip netns exec ns2 ip link

发现state是DOWN,并且还是没有IP

启动veth-ns1和veth-ns2

ip netns exec ns1 ip link set veth-ns1 up
ip netns exec ns2 ip link set veth-ns2 up

再次查看

ip netns exec ns1 ip a
ip netns exec ns2 ip a

发现state是UP状态,并且有了ip

此时两个network namespace 互相ping一下,就可以ping通了

ip netns exec ns1 ping 192.168.0.12
ip netns exec ns2 ping 192.168.0.11

container的namespace

每一个container都会有一个自己的network namespace,并且是独立的

docker run -d --name centos7-1 centos:centos7
docker run -d --name centos7-2 centos:centos7

查看容器中的ip

docker exec -it centos7-1 ip a
docker exec -it centos7-2 ip a

互相ping是可以ping通的

container网络-bridge

docker0默认bridge

查看centos的网络

3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:c5:68:11:76 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:c5ff:fe68:1176/64 scope link 
       valid_lft forever preferred_lft forever
23: veth7f13579@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether f6:67:32:59:9e:78 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::f467:32ff:fe59:9e78/64 scope link 
       valid_lft forever preferred_lft forever
25: veth631d8a1@if24: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 62:35:35:c3:c8:33 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::6035:35ff:fec3:c833/64 scope link 
       valid_lft forever preferred_lft forever

查询centos容器的网络

[root@localhost ~]# docker exec -it centos7-1 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
22: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@localhost ~]# docker exec -it centos7-2 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
24: eth0@if25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

他们之间可以互相ping通

也就是说,centos7-1中,有一个eth0和宿主机的docker0中有一个veth是成对的

可以通过命令确认一下

yum install -y bridge-utils
brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.0242c5681176       no              veth631d8a1
                                                        veth7f13579

这种网络连接方式称为Bridge,也可以通过命令查询docker中的网络模式

[root@localhost ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
7fdff14028b3   bridge    bridge    local
1f1c27770d36   host      host      local
0277734635d6   none      null      local

bridge是docker中默认的网络模式

[root@localhost ~]# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "7fdff14028b3b010919924479c67d0ac87099bb188b8fef4bdecbdf30f883df2",
        "Created": "2022-04-17T07:48:55.84226302-04:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "65454b5e0b8f2cd8d788dc8ef077f48525418a5b9197430c9e93719663348483": {
                "Name": "centos7-1",
                "EndpointID": "46dc40fff1983f95690b4c13e72707e845aff2baf9f737a7e108ed959dd448a1",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "c0a827c6b044b7dfbe634c61f7ba31ca3caa11bdee4f4140ad1dc22fb1727de6": {
                "Name": "centos7-2",
                "EndpointID": "143c5c5e836f95e232fb904e8d6e0af74f121511a751d24689884145d41248fb",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

创建自己的network

创建一个network,类型为bridge

docker network create centos-net
or 
docker network create --subnet=172.18.0.0/24 centos-net

查看已有的network

[root@localhost ~]# docker network ls
NETWORK ID     NAME         DRIVER    SCOPE
7fdff14028b3   bridge       bridge    local
1f1c27770d36   host         host      local
0277734635d6   none         null      local
51c95c2d6a71   centos-net   bridge    local

查看tomcat-net详细信息

[root@localhost ~]# docker network inspect centos-net
[
    {
        "Name": "tomcat-net",
        "Id": "51c95c2d6a71e7e4155b22631bc24d4c865665ab0620f6644b9438d143005427",
        "Created": "2022-04-17T16:05:23.848564764-04:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

创建tomcat容器,并指定使用tomcat-net

docker run -itd --name centos-net --network centos-net centos:centos7

查看customer-net-tomcat的网络信息

docker exec -it centos-net ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
29: eth0@if30: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever

查看网卡信息

3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:c5:68:11:76 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:c5ff:fe68:1176/64 scope link 
       valid_lft forever preferred_lft forever
26: br-51c95c2d6a71: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:95:29:2e:ac brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-51c95c2d6a71
       valid_lft forever preferred_lft forever
    inet6 fe80::42:95ff:fe29:2eac/64 scope link 
       valid_lft forever preferred_lft forever
30: vethf128399@if29: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-51c95c2d6a71 state UP group default 
    link/ether 22:5c:e0:51:f7:40 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::205c:e0ff:fe51:f740/64 scope link 
       valid_lft forever preferred_lft forever

查看网卡连接

[root@localhost ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br-51c95c2d6a71         8000.024295292eac       no              vethf128399
docker0         8000.0242c5681176       no

此时在centos-net容器中ping centos7-1,发现无法ping通

[root@localhost ~]# docker exec -it centos-net ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
^C
--- 172.17.0.2 ping statistics ---
11 packets transmitted, 0 received, 100% packet loss, time 10405ms

将centos7-1容器连接到centos-net上,这个centos-net为我们创建的network的名字

docker network connect centos-net centos7-1

查看centos-net网络,可以发现centos7-1容器也在其中

docker network inspect centos-net

此时,两个容器就可以互相ping通了,并且可以通过容器名称进行ping操作

docker exec -it centos-net ping centos7-1

container网络的host和none类型

host

创建容器,指定网络类型为host

 docker run -itd --name my-centos-host --network host centos:centos7

查看容器的ip,发现与宿主机的ip是一致的

none

创建容器,指定网络类型为none

docker run -itd --name my-centos-none --network none centos:centos7

查看none网络,发现没有IP地址

docker compose

https://docs.docker.com/compose/gettingstarted/

docker-compose是用于定义和运行多容器docker应用程序的工具,通过yml文件来进行配置

compose模板文件

默认的模板文件名称为docker-compse.yml

一个 docker-compose文件可以分为三层

# 第一层 版本号
version: "3.8"
# 第二层,定义service服务配置
services:
  web:
    build: . # dockerfile的上下文目录为当前目录
    ports: # 宿主机和容器的端口映射
      - "8080:8080"
    volumes:
      - /app/:/app # 目录或文件映射
  redis:
    image: "redis:alpine" # 镜像名称
  app:
    build:
      context: /app # dockerfile上下文目录
      dockerfile: app-Dockerfile # 指定dockerfile
      args:
        buildno: 1

build

指定Dockerfile所在文件夹的路径,可以是绝对路径,也可以是相对路径,Compose会使用它自动构建镜像,然后使用

也可以使用context指定Dockfile所在文件夹,使用dockerfile指定Dockfile名称

使用arg指定指定构建镜像时的变量

command

覆盖容器启动后默认执行的命令,类似于docker run image 命令

例如下面的Dockerfile,容器启动是执行的java -jar app.jar

FROM openjdk:8-jre
EXPOSE 8081
ENV APP_PATH=/app
WORKDIR $APP_PATH
COPY app.jar $APP_PATH
ENTRYPOINT ["java","-jar"]
CMD ["app.jar"]

如果想要容器启动时,执行的是 java -jar test.jar,在docker-compose.yml中使用指令command: ["test.jar"]

version: "3"
services:
  webapp:
    build:
      context: ./dir
      dockerfile: app-Dockerfile
      args:
        buildno: 1
    command: ["test.jar"]

container_name

指定容器名称,默认命名为项目名称_服务名称_序号,指定后,该服务将无法进行扩展(scale),docker不允许有多个容器使用相同的名称

depends_on

解决容器的依赖,启动先后问题。

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

运行此compose时,会先启动redis、db,再启动web

在启动web服务时,并不会等待redis和db服务进入ready状态,而只是等它们称为被启动(running)状态

enviroment

设置环境变量,相当于docker run -e。可以使用数组和字典两种格式

version: "3"
services:
  mysql:
    image: mysql:5.7
    ports:
      - 3306:3306
    enviroment:
      MYSQL_ROOT_PASSWORD: 123456
#==================================
    enviroment:
      - "MYSQL_ROOT_PASSWORD=123456"

env_file

从文件中获取环境变量,可以为单独的文件路径或者列表

如果通过docker-compose -f FILE方式来指定Compose模板文件,则env_file中变量的路径会基于模板文件路径。

如果有变量的名称与enviroment指令冲突,则以environment为准。

env_file: .env
env_file:
  - ./common.env
  - ./.env

expose

用来指定镜像构建过程中容器暴露的端口号,但是不映射到宿主机,只能被连接的服务访问。

一般不在compose配置文件中指定,一般在Dockerfile中使用EXPOSE指定。

image

镜像名称或者ID。如果镜像在本地不存在,则会拉取镜像

networks

指定启动容器时使用的网络,相当于docker run --network

version: "3"
services:
  some-service:
    networks: # 指定使用的网络
      - network-1
      - network-2
networks: # 创建网络
  network-1: 
  network- 2: 

ports

指定宿主机和容器端口的映射,或者仅指定容器的端口(宿主机将随机选择端口)。

当使用HOST:CONTAINER 格式来映射时,如果使用的容器端口小于60,并且没有放在引号里,可能会得到错误的结果,因为yaml会自动解析xx:yy这种数字格式为60机制。

volumes

指定宿主机目录与容器目录映射

version: "3"
services:
  mysql:
    image: mysql:5.7
    volumes: # 数据卷名称挂载
     - mysql_data:/var/lib/mysql
volumes: #定义数据卷名称
  mysql_data: /app/mysql/

restart

指定容器退出后的重启策略

restart: always

常用命令

命令对象与格式

docker-compose --help 可以查看完整命令

docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
  • -f 指定使用Compose模板文件,默认为docker-compose.yml,可以指定多次
  • -p 指定项目名称,默认使用所在目录名称作为项目名称
  • --verbose 输出跟多调试信息
  • -v 打印版本并退出

commands

up

  • 该命令将尝试自动完成包括构建镜像,创建服务,启动服务,关联服务相关容器等操作
  • 链接的服务都将被自动启动,除非已经处于运行状态
  • docker-compose up将在前台启动,并将日志打印在控制台,通过ctrl+c进行停止时,所有容器都将停止
  • docker-compose up -d 将会在后台启动所有容器

docker-compose up --help

docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]

options:

  • -d 后台运行
  • --no-color 不使用颜色来区分不同的服务器控制台输出
  • --no-deps 不启动服务器所链接的容器
  • --force-recreate 强制重新创建容器,不能与--no-recreate同时使用
  • --no-recreate 如果容器已经存在,则不重新创建
  • --no-build 不自动创建缺失的服务镜像
  • -t 停止容器的时候超时时间,默认10秒
  • --scale 创建多少个容器,同个service=num指定,如docker-compose up --scale app=5 -d 表示将对app服务创建5个容器同时后台启动

down

# 此命令会停止up命令启动的所有容器,并移除网络,匿名数据卷可能会被移除
docker-compose down
#停止指定的服务
docker-compose down 服务名

exec

进入执行的容器

docker-compose exec 服务名 /bin/bash

ps

列出项目中目前所有的容器

docker-compose ps [options] [SERVICE...]

restart

重启所有已经停止或者正在运行的服务

docker-compose restart [options] [SERVICE...]

rm

删除所有停止状态的服务容器,推荐先执行docker-compose stop 命令来停止容器

docker-compose rm [options] [SERVICE...]
  • -f 强制删除,包括非停止状态的容器
  • -v 删除容器所挂载的数据卷

top

查看项目中各个服务容器内运行的进程

如果加上服务名,就是查询项目指定服务容器的进程

unpause/pause

pause:暂停一个服务容器

docker-compose pause [SERVICE...]

unpause:恢复处于暂停状态的中的服务

docker-compose unpause [SERVICE]

logs

查看服务容器的输出,默认情况下,docker-compose将对不同的服务输出使用不同的颜色

docker-compose logs 服务名

docker swarm

https://docs.docker.com/swarm/