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后面跟镜像名称,表示要基于哪个基础镜像进行构建 |
RUN | RUN后面跟一个具体的命令,类似于Linux命令行执行命令 |
ADD | 拷贝本机文件或者远程文件到镜像内,压缩文件会自动解压 |
COPY | 拷贝本地文件到镜像内 |
USER | 指定容器启动的用户 |
ENTRYPOINT | 容器的启动命令 |
CMD | CMD为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/