Docker学习笔记8.Docker Compose
Posted 海棠赠微雨.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker学习笔记8.Docker Compose相关的知识,希望对你有一定的参考价值。
Docker Compose
Compose 简介
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
如果你还不了解 YML 文件配置,可以先阅读 YAML 入门教程。
Compose 使用的三个步骤:
- 使用 Dockerfile 定义应用程序的环境。
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
- 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
docker-compose.yml 的配置案例如下(配置参数参考下文):
实例
# yaml 配置实例
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01:
Compose 安装
Linux 上我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases。
运行以下命令以下载 Docker Compose 的当前稳定版本:
$ sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
要安装其他版本的 Compose,请替换 v2.2.2。
Docker Compose 存放在 GitHub,不太稳定。
你可以也通过执行下面的命令,高速安装 Docker Compose。
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
将可执行权限应用于二进制文件:
$ sudo chmod +x /usr/local/bin/docker-compose
创建软链:
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功:
$ docker-compose version
cker-compose version 1.24.1, build 4667896b
注意: 对于 alpine,需要以下依赖包: py-pip,python-dev,libffi-dev,openssl-dev,gcc,libc-dev,和 make。
macOS
Mac 的 Docker 桌面版和 Docker Toolbox 已经包括 Compose 和其他 Docker 应用程序,因此 Mac 用户不需要单独安装 Compose。Docker 安装说明可以参阅 MacOS Docker 安装。
windows PC
Windows 的 Docker 桌面版和 Docker Toolbox 已经包括 Compose 和其他 Docker 应用程序,因此 Windows 用户不需要单独安装 Compose。Docker 安装说明可以参阅 Windows Docker 安装。
使用
1、准备
创建一个测试目录:
$ mkdir composetest
$ cd composetest
在测试目录中创建一个名为 app.py 的文件,并复制粘贴以下内容:
composetest/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)
在此示例中,redis 是应用程序网络上的 redis 容器的主机名,该主机使用的端口为 6379。
在 composetest 目录中创建另一个名为 requirements.txt
的文件,内容如下:
flask
redis
2、创建 Dockerfile 文件
在 composetest 目录中,创建一个名为 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
COPY . .
CMD ["flask", "run"]
Dockerfile 内容解释:
- FROM python:3.7-alpine: 从 Python 3.7 映像开始构建镜像。
- WORKDIR /code: 将工作目录设置为 /code。
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
设置 flask
命令使用的环境变量。
- RUN apk add --no-cache gcc musl-dev linux-headers: 安装 gcc,以便诸如MarkupSafe 和 SQLAlchemy 之类的 Python 包可以编译加速。
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
复制 requirements.txt 并安装 Python 依赖项。
- COPY . .: 将 . 项目中的当前目录复制到 . 镜像中的工作目录。
- CMD [“flask”, “run”]: 容器提供默认的执行命令为:flask run。
3、创建 docker-compose.yml
在测试目录中创建一个名为 docker-compose.yml 的文件,然后粘贴以下内容:
docker-compose.yml 配置文件
# yaml 配置
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
该 Compose 文件定义了两个服务:web 和 redis。
-
web:该 web 服务使用从 Dockerfile 当前目录中构建的镜像。然后,它将容器和主机绑定到暴露的端口 5000。此示例服务使用Flask Web 服务器的默认端口 5000 。
-
redis:该 redis 服务使用 Docker Hub 的公共 Redis 映像。
4、使用 Compose 命令构建和运行您的应用
在测试目录中,执行以下命令来启动应用程序:
docker-compose up
如果你想在后台执行该服务可以加上 -d
参数:
docker-compose up -d
yml 配置指令参考
version
指定本 yml 依从的 compose 哪个版本制定的。
build
指定为构建镜像上下文路径:
例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:
version: "3.7"
services:
webapp:
build: ./dir
或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args:
version: "3.7"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
target: prod
- context:上下文路径。
- dockerfile:指定构建镜像的 Dockerfile 文件名。
- args:添加构建参数,这是只能在构建过程中访问的环境变量。
- labels:设置构建镜像的标签。
- target:多层构建,可以指定构建哪一层。
cap_add,cap_drop
添加或删除容器拥有的宿主机的内核功能。
cap_add:
- ALL # 开启全部权限
cap_drop:
- SYS_PTRACE # 关闭 ptrace权限
cgroup_parent
为容器指定父 cgroup 组,意味着将继承该组的资源限制。
cgroup_parent: m-executor-abcd
command
覆盖容器启动的默认命令。
command: ["bundle", "exec", "thin", "-p", "3000"]
container_name
指定自定义容器名称,而不是生成的默认名称。
container_name: my-web-container
depends_on
设置依赖关系。
- docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。
- docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
- docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注意:web 服务不会等待 redis db 完全启动 之后才启动。
deploy
指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用。
version: "3.7"
services:
redis:
image: redis:alpine
deploy:
mode:replicated
replicas: 6
endpoint_mode: dnsrr
labels:
description: "This redis service label"
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
可以选参数:
endpoint_mode:访问集群服务的方式。
endpoint_mode: vip
# Docker 集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。
endpoint_mode: dnsrr
# DNS 轮询(DNSRR)。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。
labels:在服务上设置标签。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。
mode:指定服务提供的模式。
- replicated:复制服务,复制指定服务到集群的机器上。
- global:全局服务,服务将部署至集群的每个节点。
图解:下图中黄色的方块是 replicated 模式的运行情况,灰色方块是 global 模式的运行情况。
replicas:mode 为 replicated 时,需要使用此参数配置具体运行的节点数量。
resources:配置服务器资源使用的限制,例如上例子,配置 redis 集群运行需要的 cpu 的百分比 和 内存的占用。避免占用资源过高出现异常。
restart_policy:配置如何在退出容器时重新启动容器。
- condition:可选 none,on-failure 或者 any(默认值:any)。
- delay:设置多久之后重启(默认值:0)。
- max_attempts:尝试重新启动容器的次数,超出次数,则不再尝试(默认值:一直重试)。
- window:设置容器重启超时时间(默认值:0)。
rollback_config:配置在更新失败的情况下应如何回滚服务。
- parallelism:一次要回滚的容器数。如果设置为0,则所有容器将同时回滚。
- delay:每个容器组回滚之间等待的时间(默认为0s)。
- failure_action:如果回滚失败,该怎么办。其中一个 continue 或者 pause(默认pause)。
- monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
- max_failure_ratio:在回滚期间可以容忍的故障率(默认为0)。
- order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认 stop-first )。
update_config:配置应如何更新服务,对于配置滚动更新很有用。
- parallelism:一次更新的容器数。
- delay:在更新一组容器之间等待的时间。
- failure_action:如果更新失败,该怎么办。其中一个 continue,rollback 或者pause (默认:pause)。
- monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
- max_failure_ratio:在更新过程中可以容忍的故障率。
- order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认stop-first)。
注:仅支持 V3.4 及更高版本。
devices
指定设备映射列表。
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
dns
自定义 DNS 服务器,可以是单个值或列表的多个值。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
dns_search
自定义 DNS 搜索域。可以是单个值或列表。
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
entrypoint
覆盖容器默认的 entrypoint。
entrypoint: /code/entrypoint.sh
也可以是以下格式:
entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit
env_file
从文件添加环境变量。可以是单个值或列表的多个值。
env_file: .env
也可以是列表格式:
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
environment
添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
environment:
RACK_ENV: development
SHOW: 'true'
expose
暴露端口,但不映射到宿主机,只被连接的服务访问。
仅可以指定内部端口为参数:
expose:
- "3000"
- "8000"
extra_hosts
添加主机名映射。类似 docker client --add-host。
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
以上会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系:
162.242.195.82 somehost
50.31.209.229 otherhost
healthcheck
用于检测 docker 服务是否健康运行。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"] # 设置检测程序
interval: 1m30s # 设置检测间隔
timeout: 10s # 设置检测超时时间
retries: 3 # 设置重试次数
start_period: 40s # 启动后,多少秒开始启动检测程序
image
指定容器运行的镜像。以下格式都可以:
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd # 镜像id
logging
服务的日志记录配置。
driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项
driver: "json-file"
driver: "syslog"
driver: "none"
仅在 json-file 驱动程序下,可以使用以下参数,限制日志得数量和大小。
logging:
driver: json-file
options:
max-size: "200k" # 单个文件大小为200k
max-file: "10" # 最多10个文件
当达到文件限制上限,会自动删除旧得文件。
syslog 驱动程序下,可以使用 syslog-address 指定日志接收地址。
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
network_mode
设置网络模式。
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
networks
配置容器连接的网络,引用顶级 networks 下的条目 。
services:
some-service:
networks:
some-network:
aliases:
- alias1
other-network:
aliases:
- alias2
networks:
some-network:
# Use a custom driver
driver: custom-driver-1
other-network:
# Use a custom driver which takes special options
driver: custom-driver-2
aliases :同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。
restart
- no:是默认的重启策略,在任何情况下都不会重启容器。
- always:容器总是重新启动。
- on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
- unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
注:swarm 集群模式,请改用 restart_policy。
secrets
存储敏感数据,例如密码:
version: "3.1"
services:
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret
secrets:
- my_secret
secrets:
my_secret:
file: ./my_secret.txt
security_opt
修改容器默认的 schema 标签。
security-opt:
- label:user:USER # 设置容器的用户标签
- label:role:ROLE # 设置容器的角色标签
- label:type:TYPE # 设置容器的安全策略标签
- label:level:LEVEL # 设置容器的安全等级标签
stop_grace_period
指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器。
stop_grace_period: 1s # 等待 1 秒
stop_grace_period: 1m30s # 等待 1 分 30 秒
默认的等待时间是 10 秒。
stop_signal
设置停止容器的替代信号。默认情况下使用 SIGTERM 。
以下示例,使用 SIGUSR1 替代信号 SIGTERM 来停止容器。
stop_signal: SIGUSR1
sysctls
设置容器中的内核参数,可以使用数组或字典格式。
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
tmpfs
在容器内安装一个临时文件系统。可以是单个值或列表的多个值。
tmpfs: /run
tmpfs:
- /run
- /tmp
ulimits
覆盖容器默认的 ulimit。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
volumes
将主机的数据卷或着文件挂载到容器里。
version: "3.7"
services:
db:
image: postgres:latest
volumes:
- "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
- "/localhost/data:/var/lib/postgresql/data"
Docker 学习笔记 Docker 基础操作实,Docker仓库数据卷,网络基础学习
Docker 学习笔记【3】 Docker 仓库实操,创建私有仓库,实操数据卷、数据卷容器,实操 网络基础 ---------高级网络配置和部分实战案例学习
=============================================================
Docker 学习笔记【1】Docker 相关概念,基本操作--------实操记录开始
=============================================================
被格式化的脚本内容:
#开头代表宿主机的root用户执行的命令
[[email protected] /]# 类似开头的,实在docker启动的实例中执行的命令
--1--安装:
1、环境信息:
硬件:基于openstack的一台云虚拟主机 配置为:16C 32GB 此机上还运行了:两个mysql数据库,一个开发,一个测试,一个tomcat做zabbix通过jmx监控实验,后续会有相关文档 系统信息:CentOS release 6.8 (Final) uname -a:Linux b-test14 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux 用户:root
2、开始安装:
安装docker:
#yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm #yum install docker-io
检查安装:
#docker -v Docker version 1.7.1, build 786b29d/1.7.1 # ifconfig docker0 Link encap:Ethernet HWaddr 00:00:00:00:00:00 inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::dcb0:1aff:fe0a:8982/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:7 errors:0 dropped:0 overruns:0 frame:0 TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:460 (460.0 b) TX bytes:468 (468.0 b)
启动docker后台服务:
# service docker start Starting cgconfig service: [ OK ] Starting docker: [ OK ] # chkconfig docker on
后台服务启动检查:
#ps -ef | grep docker root 15982 1 0 10:33 pts/1 00:00:00 /usr/bin/docker -d root 16154 15286 0 10:35 pts/1 00:00:00 grep docker # chkconfig --list | grep docker docker 0:off 1:off 2:on 3:on 4:on 5:on 6:off
3、获取镜像:
注:12.04为笔记【1】中的内容,呼应一下,不过我们应用主要跑在centos下,所以后续的主要实操会基于centos 6.8
# docker pull ubuntu:12.04 12.04: Pulling from ubuntu 94bf32934729: Pull complete 5e12b5525fb8: Pull complete df24de65c977: Pull complete 8cc279ff6556: Pull complete 13c47942ea6e: Pull complete cfc2576a1531: Pull complete Digest: sha256:6ab19ca6ef048136b8aeb513e6fb715c005fd671a536039567b1d261f2f0779e Status: Downloaded newer image for ubuntu:12.04 # docker pull centos:6.8 6.8: Pulling from centos 3690474eb5b4: Pull complete 386c6db8c14f: Pull complete 8986abc42d08: Pull complete 80e46367f846: Pull complete Digest: sha256:233cbc13832f97e83773d2e4a6f9f3a81959bc9b5c1b03135d6bbd67a9db8b66 Status: Downloaded newer image for centos:6.8
本地镜像检查:
# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu 12.04 cfc2576a1531 6 weeks ago 103.6 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB
4、扩展:
time命令,可以统计某个命令执行耗时,如下,可看出docker启动一个echo应用,约3s:
time docker run centos:6.8 /bin/echo what what real 0m2.645s user 0m0.031s sys 0m0.027s
通过镜像启动一个docker实例,整个过程约3s:
启动echo应用输出一个what,效率略低于直接在本地执行:
# docker run centos:6.8 /bin/echo what what
启动bash交互界面,启动过程约3-5s可以通过ps看出,启动十分轻量级
# docker run -t -i centos:6.8 /bin/bash [[email protected] /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var [[email protected] /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 02:42 ? 00:00:00 /bin/bash root 12 1 0 02:42 ? 00:00:00 ps -ef [[email protected] /]# pwd /
5、修改镜像:
终端1【不要exit】:
#docker run -t -i centos:6.8 /bin/bash [[email protected] /]# yum install lrzsz Loaded plugins: fastestmirror, ovl Setting up Install Process Determining fastest mirrors * base: mirrors.btte.net * extras: mirrors.btte.net * updates: mirrors.tuna.tsinghua.edu.cn Resolving Dependencies --> Running transaction check ---> Package lrzsz.x86_64 0:0.12.20-27.1.el6 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================================================================= Package Arch Version Repository Size ================================================================================================================================= Installing: lrzsz x86_64 0.12.20-27.1.el6 base 71 k Transaction Summary ================================================================================================================================= Install 1 Package(s) Total download size: 71 k Installed size: 159 k Is this ok [y/N]: y Downloading Packages: lrzsz-0.12.20-27.1.el6.x86_64.rpm | 71 kB 00:00 warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 Importing GPG key 0xC105B9DE: Userid : CentOS-6 Key (CentOS 6 Official Signing Key) <[email protected]> Package: centos-release-6-8.el6.centos.12.3.x86_64 (@CentOS/6.8) From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 Is this ok [y/N]: y Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : lrzsz-0.12.20-27.1.el6.x86_64 1/1 Verifying : lrzsz-0.12.20-27.1.el6.x86_64 1/1 Installed: lrzsz.x86_64 0:0.12.20-27.1.el6 Complete!
终端2:
注意:
查看所有已经创建的container实例:
#docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 17d146c6710d centos:6.8.my.1 "/bin/bash" 18 minutes ago Exited (0) 17 minutes ago kickass_swartz 4bdb037d6f75 cbbdcb29ca218d27ec12327346f8da0307a69d9727b733dff4db19223bd95c0f "/bin/sh -c ‘yum -y 22 minutes ago Exited (137) 20 minutes ago berserk_kilby 8f2e422eb7ae cbbdcb29ca218d27ec12327346f8da0307a69d9727b733dff4db19223bd95c0f "/bin/sh -c ‘yum ins 23 minutes ago Exited (1) 22 minutes ago evil_mestorf 11b3d795a062 centos:6.8.my "/bin/bash" 25 minutes ago Exited (0) 24 minutes ago suspicious_mccarthy e283711c5bdf centos:6.8.my "/bin/bash" 26 minutes ago Exited (1) 26 minutes ago stupefied_cori 4a74b6b158f0 centos:6.8.my "/bin/bash" 35 minutes ago Exited (0) 31 minutes ago backstabbing_mcclintock ec600b17b4ad centos:6.8 "/bin/bash" 42 minutes ago Exited (0) 35 minutes ago loving_lovelace 8864174c48ea centos:6.8 "/bin/bash" 47 minutes ago Exited (0) 46 minutes ago jolly_torvalds 591e0f5c1817 centos:6.8 "/bin/bash" 49 minutes ago Exited (0) 49 minutes ago cranky_torvalds bc2496541488 centos:6.8 "/bin/echo what" 50 minutes ago Exited (0) 50 minutes ago fervent_cori 2b7ee7dc7a4d centos:6.8 "/bin/bash" 52 minutes ago Exited (0) 51 minutes ago focused_bartik f144b72eb4ab centos:6.8 "/bin/echo what" 54 minutes ago Exited (0) 54 minutes ago elegant_bohr 547b76094492 centos:6.8 "/bin/echo what" 54 minutes ago Exited (0) 54 minutes ago sad_poitras 查看CONTAINER ID # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ec600b17b4ad centos:6.8 "/bin/bash" About a minute ago Up About a minute loving_lovelace
通过运行中的CONTAINER创建镜像centos:6.8.my,返回的id为镜像的唯一id
# docker commit -m "ADDed lrzsz" -a "Docker my-a" ec600b17b4ad centos:6.8.my c24da2edd993ebbbbabb81ab349f2146813ea34f9f87821630fd13ad1ab4c745
罗列所有可用镜像:
# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my c24da2edd993 About a minute ago 255 MB ubuntu 12.04 cfc2576a1531 6 weeks ago 103.6 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB
使用修改的镜像启动容器实例:
如下可见,刚才在容器通过yum安装的软件已经包含在了自己创建的镜像。
# docker run -t -i centos:6.8.my /bin/bash [[email protected] /]# rpm -qa | grep lrzsz lrzsz-0.12.20-27.1.el6.x86_64
6、创建docker镜像:
->1、使用Dockerfile:
创建目录和makefile文件:
#mkdir image_maker_sinatra #cd image_maker_sinatra #touch Dockerfile
确认镜像中不存在my.tag的文件
# docker run -t -i centos:6.8.my /bin/bash [[email protected] /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var [[email protected] /]# exit exit
Dockerfile内容:
#cenos:6.8.my.1 maker FROM centos:6.8.my MAINTAINER Docker lich <[email protected]> RUN echo "my tag" > my.tag
执行新建镜像:
# docker build -t "centos:6.8.my.1" . Sending build context to Docker daemon 2.048 kB Sending build context to Docker daemon Step 0 : FROM centos:6.8.my ---> c24da2edd993 Step 1 : MAINTAINER Docker lich <[email protected]> ---> Using cache ---> cbbdcb29ca21 Step 2 : RUN echo "my tag" > my.tag ---> Running in f89b6bc65148 ---> 3ebfbda17fb8 Removing intermediate container f89b6bc65148 Successfully built 3ebfbda17fb8
查看所有centos镜像:
# docker images centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my.1 3ebfbda17fb8 About a minute ago 255 MB centos 6.8.my c24da2edd993 19 minutes ago 255 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB
使用新镜像启动docker容器,检验内容:
如下内容可以看出,6.8.my中的lrzsz存在,并且Dockerfile中指定生成的文件、以及其内容都存在:
# docker run -t -i centos:6.8.my.1 /bin/bash [[email protected] /]# ls bin dev etc home lib lib64 lost+found media mnt my.tag opt proc root sbin selinux srv sys tmp usr var [[email protected] /]# cat my.tag my tag [[email protected] /]# rpm -qa | grep lrzsz lrzsz-0.12.20-27.1.el6.x86_64 [[email protected] /]# exit exit
-2>使用openvz【容器虚拟化的先锋技术】创建镜像:
先下载镜像【可能需要跳出墙外,这个网址在国内的访问速度几乎为0】:
#wget https://download.openvz.org/template/precreated/centos-6-x86_64-minimal.tar.gz
使用的时候报错了,这个错误的原因是下载的文件有问题,不完整或者有损坏:
# cat centos-6-x86_64-minimal.tar.gz | docker import - my_centos:6.8 Error response from daemon: ApplyLayer exit status 1 stdout: stderr: unexpected EOF
重新下载之后,导入完成
# cat centos-6-x86_64-minimal.tar.gz | docker import - my_centos:6.8 35b7ec25ed6f9657ff7581a8c7643c2ce48d1b892eac6116b783b43fc8fd9bfc
docker attach的时候执行了一个exit,导致主机除了一些问题:
报错:
# docker pull centos:6.8 Pulling repository centos Get https://index.docker.io/v1/repositories/library/centos/images: dial tcp: lookup index.docker.io: Temporary failure in name resolution
解决:
重新登录一下
【由于之前系统出现了一些问题,所以删除了部分image,现有image如下,可见my_centos:6.8已经在本地仓库了】
# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE my_centos 6.8 35b7ec25ed6f 36 minutes ago 343.8 MB ubuntu 12.04 cfc2576a1531 6 weeks ago 103.6 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB
7、镜像导出、导入:
导出【需要本地存在该镜像,如果不存在,请先pull下来】:
# docker save -o centos_68my1.tar centos:6.8.my.1 # ll total 256636 -rw-r--r-- 1 root root 262789632 Nov 10 11:31 centos_68my1.tar . # du -sh * 251M centos_68my1.tar
导入:
1、导入会校验id,如果一样就不导入了,所以要删除创建时候使用的镜像centos:6.8.my.1:
# docker images centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my.1 3ebfbda17fb8 22 minutes ago 255 MB centos 6.8.my c24da2edd993 39 minutes ago 255 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB # docker rmi 3ebfbda17fb8 Error response from daemon: Conflict, cannot delete 3ebfbda17fb8 because the container 17d146c6710d is using it, use -f to force Error: failed to remove images: [3ebfbda17fb8]
报错信息指向一个容器,说又通过该镜像启动的容器实例,因此我们需要使用-f命令强制删除镜像和通过该镜像创建的所有实例
# docker rmi -f 3ebfbda17fb8 Untagged: centos:6.8.my.1 Deleted: 3ebfbda17fb85e28ae24faa77cf8d7811e0068f428a4763042708b15d00ee2aa Deleted: cbbdcb29ca218d27ec12327346f8da0307a69d9727b733dff4db19223bd95c0f
可以看到,centos:6.8.my.1被删除了
# docker images centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my c24da2edd993 42 minutes ago 255 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB
2、删除后,进行导入操作:
# docker load --input centos_68my1.tar
可以看到导入之后镜像库里面的镜像就回来了
# docker images centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my.1 3ebfbda17fb8 25 minutes ago 255 MB centos 6.8.my c24da2edd993 43 minutes ago 255 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB 修改镜像的TAG: centos:6.8.my.1 centos:6.8.my 这样的TAG不够明显,修改一下: 首先查出image对应id: # docker images centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my.1 3ebfbda17fb8 25 minutes ago 255 MB centos 6.8.my c24da2edd993 43 minutes ago 255 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB 修改TAG: # docker tag c24da2edd993 my_centos:11.10.1 # docker tag 3ebfbda17fb8 my_centos:11.10.2 # docker images centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.8.my.1 3ebfbda17fb8 29 minutes ago 255 MB centos 6.8.my c24da2edd993 47 minutes ago 255 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB # docker images my_centos REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE my_centos 11.10.2 3ebfbda17fb8 29 minutes ago 255 MB my_centos 11.10.1 c24da2edd993 47 minutes ago 255 MB
从结果可以看出,好像是创建了两个新的镜像,实际上仔细观察就会发现他们的IMAGE ID 是一样的,也就是说,相当于创建了两个不一样名字的快捷方式,其实实体image还是同一个!
删除镜像:
在导入的时候由于需要删除再导入,已经介绍了,就不演示了
注意点:
docker rm 是删除依赖于这个镜像所有的docker容器的命令
docker rmi执行前,需要先执行docker rm 或者 在rmi后面加上-f 强制删除参数,将会删除镜像以及镜像创建出的所有容器!
8、守护态启动容器:
# docker run -d my_centos:11.10.1 /bin/sh -c "while true;do echo what is your name;sleep 1;done" f00717ca5c5eb4e449181bb99b98e8e86910b957ceda82f31e5440bf61cef979
查看运行中实例:
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f00717ca5c5e my_centos:11.10.1 "/bin/sh -c ‘while t 39 seconds ago Up 37 seconds serene_cray
查看容器输出内容
# docker logs serene_cray what is your name what is your name what is your name 。 。 。 或者 # docker logs f00717ca5c5e what is your name what is your name what is your name 。 。 。
9、终止运行中容器:
docker stop后面可以跟上id 也可是names
# docker stop serene_cray serene_cray # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10、进入守护态容器:
启动一个守护态容器:
# docker run -t -i -d my_centos:11.10.1 /bin/bash 3e4c55543d86c86961c3d0f1d7b8af212a8943e9a6c58171c61e7b5fe98fbf29 # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3e4c55543d86 my_centos:11.10.1 "/bin/bash" 4 seconds ago Up 2 seconds agitated_albattani
1、attach进入【命令完了需要多敲回车】:
# docker attach agitated_albattani [[email protected] /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var [[email protected] /]# uname -a Linux 3e4c55543d86 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux [[email protected] /]# cat /etc/issue CentOS release 6.8 (Final) Kernel \r on an \m
注:exit命令会导致容器终止!只推出attach 使用 ctrl+p 之后 ctrl+q即可推出attach 而不终止容器
2、nsenter进入:
确认版本:
# nsenter -V nsenter from util-linux-ng 2.17.2 查看docker后台运行容器的第一pid: # docker inspect --format "{{ .State.Pid }}" 43a81bd378f9 12590
将.bashrc_docker 内容加到.bashrc中
#wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker #echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
连接到后台运行的docker容器
【此方式可以使用exit,并且多个人登录获得的终端不是同步的】
# nsenter --target 12590 --mount --uts --ipc --net --pid [[email protected] /]# ls bin boot dev etc fastboot home lib lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var [[email protected] /]# mpstat -bash: mpstat: command not found [[email protected] /]# vmstat procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 27886420 65100 933628 0 0 28 31 27 33 0 0 99 1 0 [[email protected] /]# free -g total used free shared buffers cached Mem: 31 4 26 0 0 0 -/+ buffers/cache: 3 27 Swap: 0 0 0 [[email protected] /]# exit logout
11、运行中的容器快照导出,还原为镜像:
导出:
#docker export 43a81bd378f9 > my_centos.tar
导入【将当时的快照状态还原成镜像,不包括元数据和历史记录等】:
# cat my_centos.tar| docker import - my_centos:6.8.0 8247cb10fde2c99f1febfa11d5729175fb5be9afdbdf3fb581d20259e9fcd392 # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE my_centos 6.8.0 8247cb10fde2 28 seconds ago 343.8 MB my_centos 6.8 35b7ec25ed6f 53 minutes ago 343.8 MB ubuntu 12.04 cfc2576a1531 6 weeks ago 103.6 MB centos 6.8 80e46367f846 10 weeks ago 194.5 MB
12、删除容器:
docker ps
1终止状态容器
# docker rm 43a81bd378f9 43a81bd378f9
2运行中容器:
# docker rm -f 43a81bd378f9 43a81bd378f9
=============================================================
Docker 学习笔记【1】Docker 相关概念,基本操作--------实操记录结束
=============================================================
=============================================================
Docker仓库、数据卷,网络基础学习
=============================================================
--2--仓库:
1、概念:
仓库就是集中存放镜像的地方
一个比较容易混淆的就是注册服务器【Registry】,相当于一个很多仓库的管理器,合集如:
dl.dockerpool.com/ubuntu
dl.dockerpool.com注册服务器 ubuntu是仓库名
多数时候不严格区分
2、Docker Hub:
Docker官方维护的一个公共仓库,已经包括了超过15000的镜像,基本需求都可以直接下载使用。
登录:
docker login可以输入用户名密码和邮箱完成注册和登录,存储的信息在~/.dockercfg
基本操作:
搜索相关镜像:
docker search centos
下载镜像:
docker pull ${REPOSITORY}:${TAG}
自动创建:
对于要经常升级镜像内程序来说,十分方便。
有时候用户创建镜像只是为了安装某个软件,如果软件发布,则是需要手动更新镜像。
而自动创建允许用户通过Docker Hub指定跟踪一个目标网站,目前支持:GitHub和BitBucket上的项目一旦项目发生新提交,则执行自动更新。
配置自动升级步骤:
1、创建并登陆Docker Hub以及目标网站;
2、在目标网站将账号链接到Docker Hub;
3、Docker Hub中创建一个自动创建;
4、选取一个目标网站中的项目,需要包含Dockerfile,和分支;
5、指定Dockerfile的位置,并提交创建;
6、Docker Hub在自动创建页面跟踪每次创建的状态
3、私有仓库:
简述:
docker-registry官方提供的工具,可以用于构建私有的镜像仓库
安装运行--官方给出的registry镜像:
安装完Docker后,可以通过获取官方registry镜像来运行:
docker run -d -p 5000:5000 registry
这将使用官方的registry镜像启动本地仓库,用户也可以通过制定参数配置私有仓库位置,比如亚马逊的s3存储:
docker run -e SETTINGS_FLAVOR=s3 -e AWS_BUCKET=存储桶的名称 -e STORGE_PATH=/registry【s3桶存储没有目录,只是为了做访问路径用】 -e AWS_KEY=用户创建s3的key -e AWS_SECRET=亚马逊登录凭证 -e SEARCH_BACKEND=备份位置 -p 5000:5000 registry
此外,可以制定本地路径,如【将镜像存储位置修改为/home/admin/registry】:
docker run -d -p 5000:5000 -v /home/admin/registry:/registry registry
安装运行--本地运行:
yum方式:
yum install -y python-devel libevent-devel python-pip gcc xz-devel pip install docker-registry
也可下载源码进行安装:
git clone https://github.com/docker/docker-registry.git cd docker-registry python setup.py install
启动:
docker-registry
修改config.yml的内容修改镜像存储内容:storage_path
cp config/config_sample.yml config/config.yml
高级模式:
启动web服务:
gunicorn -c contrib/gunicorn.py docker_registry.wsgi:application
或者:
gunicorn --access-logfile - --error-logfile - -k gevent -b 0.0.0.0:5000 -w 4 --max-requests 100 docker_registry.wsgi:application
提交指定容器到私有仓库:
docker tag ubuntu:12.04 私有库IP:5000/ubuntu:12.04 docker push 私有库IP:5000/ubuntu
从指定服仓库下载:
docker pull ${REPOSITORY}:${TAG}
自动上传本地所有image到本地的镜像,默认的服务器为127.0.0.1:5000:
wget https://github.com/yeasy/docker_practice/raw/master/_local/push_images.sh chmod a+x push_images.sh ./push_images.sh
查看私服中的所有镜像:
curl 私有库IP:5000/v1/search
返回的是json,里面的镜像列表
仓库配置文件【默认配置文件中】:
Docker的registry利用配置文件提供了一些仓库的模板,flavor,用户可以直接使用它们进行开发或者测试生产的部署
配置文件模板解释:
common :基础配置 ocal :存储数据到本地文件系统 s3 :存储数据到 AWS S3 中 dev :使用 local 模板的基本配置 test :单元测试使用 prod :生产环境配置(基本上跟s3配置类似) gcs :存储数据到 Google 的云存储 swift :存储数据到 OpenStack Swift 服务 glance :存储数据到 OpenStack Glance 服务,本地文件系统为后备 glance-swift :存储数据到 OpenStack Glance 服务, Swift 为后备 elliptics :存储数据到 Elliptics key/value
用户也可以自定义模板段
默认使用的模板是dev,要使用某个模板作为默认值,添加SETTINGS_FLAVOR到环境变量例如:
export SETTINGS_FLAVOR=dev
文件中,支持环境变量中加载某些值:
_env:VARIABLENAME[:DEFAULT]
文件示例:
common: loglevel:info search_backend:"_env:SEARCH_BACKEND:" sqlalchemy_index_database:"_env:SQLALCHEMY_INDEX_DATABASE:sqlite:////tmp/docker-registry.db" prod: loglevel:warnstorage:s3 s3_access_key:_env:AWS_S3_ACCESS_KEY s3_secret_key:_env:AWS_S3_SECRET_KEY s3_bucket:_env:AWS_S3_BUCKET boto_bucket:_env:AWS_S3_BUCKET storage_path:/srv/docker smtp_host:localhost from_addr:[email protected] to_addr:[email protected] dev: loglevel:debugstorage:local storage_path:/home/myself/docker test: storage:local storage_path:/tmp/tmpdockertmp
--3--数据卷和数据卷容器:
Docker内部以及容器之间如何管理数据,主要方式就是:
1、数据卷:DATA VOLUMES
2、数据卷容器:DATA VOLUME CONTAINERS
1、数据卷:
数据卷是一个可提供一个或者多个容器使用的特殊目录,它绕过UFS,可提供很多的有用的特性:
1>数据卷可以再各容器实例之间共享和重复使用
2>对数据卷的修改立即生效
3>对数据卷的更新不影响镜像
4>卷一直存在,知道没有容器再使用
2、创建数据卷:
docker 命令使用-v参数来创建一个数据卷并挂在到容器中:
创建一个名为web 将数据卷training/webapp挂在到容器的/webapp目录并执行 python app.py命令
docker run -d -P --name web -v /webapp training/webapp python app.py
Dockerfile中也可以使用VOLUME 来添加一个或者多个新的数据卷到该镜像创建的任意容器中
挂在一个宿主机的目录作为数据卷:
将主机的/src/webapp目录加到到容器的/opt/webapp目录下
注意:
1、一般用于测试,docker运行是否正常
2、目录路径必须是绝对路径
3、如果本地路径目录不存在,docker会自动创建
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
默认挂在的数据卷权限是读写皆可,如要挂在一个只读权限的目录如下:
docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
当然也可以挂在单个文件到容器,必须想记录容器中的history的命令记录
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
注意:
只挂在一个文件,在使用编辑工具的时候,比如 vi sed等,会导致文件inode的改变,1.1.0版本的docker起,这会导致报错。最好的办法是,挂在文件所在的父目录
数据卷容器:
如果有一些持续更新的数据需要在容器之间共享,最好创建一个数据卷容器:
数据卷容器其实也是一个容器,功能是专门提供数据卷供其他容器挂在!
创建一个数据卷容器,名字为dbdata:
docker run -it -v /dbdata:/dbdata --name dbdata training/postgres centos #docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container fo...
创建其他容器时,使用--volumes-from来挂在dbdata中的数据卷
docker run -d --volumes-from dbdata --name db1 training/postgres docker run -d --volumes-from dbdata --name db2 training/postgres
也可以使用多个--volumes-from 参数来从多个容器挂载多个数据卷,也可以从其他已经挂在了数据卷的容器来挂在数据卷
docker run -d --name db3 --volumes-from db1 training/postgres
使用--volumes-from参数所挂载数据卷的容器自己并不需要保持在运行状态
如果删除了挂载的容器,数据卷并不会自动删除,如果需要删除一个数据卷,必须在删除最后一个还挂载着该数据卷的容器时候使用docker rm -v来删除关联的数据卷,这可以让我们在容器之间升级和移动数据卷
3、利用数据卷容器,进行备份、恢复、迁移数据卷:
可以利用数据卷对其中的数据进行备份、恢复、迁移
备份:
docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar
容器启动后,使用了 tar 命令来将 dbdata 卷备份为本地的 /backup/backup.tar
恢复:
如果要恢复数据到一个容器,首先,要创建一个带有数据卷的容器:dbdata2
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然后创建另一个容器,并使用tar解压备份文件到挂在的容器中
docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
这样就完成了数据的备份和恢复
--4--docker中的网络:
Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。
1、外部访问容器:
docker在run的时候使用-P标记,会使Docker随机映射一个49000-49900的端口到内部容器开放的端口
docker run -d -P training/webapp python app.py docker ps
使用docker ps可以看到
PORTS列,有这样的标记0.0.0.0:49000->5000
此时访问,宿主机ip的49000端口就是访问docker容器的5000提供的web服务端口
可使用docker logs -f ${CONATINER_ID}持续关注docker的输出
docker在run的时候使用-p标记,则可以指定端口并且一个端口只可以绑定一个容器。支持的格式有
ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
映射所有接口地址
使用hostPort:containerPort 格式本地的 5000 端口映射到容器的 5000 端口,可以执行
docker run -d -p 5000:5000 training/webapp python app.py
映射到指定ip的指定端口:
可以使用 ip:hostPort:containerPort 格式指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
映射到指定地址的任意端口
使用 ip::containerPort 绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
当然还可以使用udp标记来指定udp端口:
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
查看已经映射的端口配置:
docker port ${CONATINER_ID} 5000
注意: 1、容器有自己的内部网络和ip地址【使用docker inspect 可以获取所有变量。Docker还可以有一个可变的网络配置】 2、-p可以使用多次来绑定多个端口: docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
--5--容器互联:
容器的连接【linking】是除了端口映射以外,另一种与容器中应用交互的方式
该系统会在源和接受容器之间创建一个隧道,接受容器可以看到源容器的指定信息
自定义容器名称 --name
1、好记 有意义的名称好使用
2、可以作为参考点
docker run -d -P --name web training/webapp python app.py
docker ps 列表中会有NAME列
inspect查看docker的名字
docker inspect -f "{{ .Name }}" aed84ee21bde
注意:--rm 在终止实例后即删除容器实例 与 --d 不可同时使用
容器互联:--link参数让容器之间进行安全交互
创建一个新的数据容器
docker run -d --name db training/postgres
清空容器实例列表
创建一个新的web容器连接到db容器
sudo docker run -d -P --name web --link db:db training/webapp python app.py
此时,db 容器和 web 容器建立互联关系。
--link 参数的格式为
--link name:alias ,其中
name 是要链接的容器的名称, alias 是这个连接的 别名。
docker ps
可以用来查看容器link
可以看到自定义命名的容器,db 和 web,db 容器的 names 列有 db 也有 web/db。这表示 web 容器链接到 db 容器,web 容器将被允许访问 db 容器的信息。
Docker 在两个互联的容器之间创建了一个安全隧道,而且不用映射它们的端口到宿主主机上。在启动 db容器的时候并没有使用 -p 和 -P 标记,从而避免了暴露数据库端口到外部网络上。
1、Docker通过两种方式为容器公开连接信息:
1、环境变量
2、更新/etc/hosts文件
env查看当前变量
sudo docker run --rm --name web2 --link db:db training/webapp env
其中 DB_ 开头的环境变量是供 web 容器连接 db 容器使用,前缀采用大写的连接别名。
docker run -t -i --rm --link db:db training/webapp /bin/bash cat /etc/hosts
里面会有两个一个是当前容器的name解析 一个是link的容器的name解析
用户可以连接多个子容器到父容器。
以上是关于Docker学习笔记8.Docker Compose的主要内容,如果未能解决你的问题,请参考以下文章