文章目录
安装
以下操作步骤以 CentOS 7.x 为例,其他系统平台虽有些许差异,但可举一反三。
自动化安装
curl -fsSL https://get.docker.com | bash -s docker --mirror aliyun
或
curl -sSL https://get.daocloud.io/docker | sh
手动安装
设置仓库
- 安装软件依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 设置docker依赖仓库(源)
官方(不太建议,速度较慢)
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
阿里云
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
清华大学
sudo yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
- 安装 docker engine-community & containerd
sudo yum install docker-ce docker-ce-cli containerd.io
- 启动docker
systemctl start docker
- 删除docker
rpm -e `rpm -qa|grep -i docker`
rpm -e `rpm -qa|grep -i contain`
rm -rf /var/lib/docker
- docker环境信息查看
docker info ----显示 Docker 系统信息,包括镜像和容器数
docker version ----显示 Docker 版本信息
镜像仓库配置
- 修改仓库源文件
删除 /etc/rpm.repo.d/docker* 文件后,执行安装时的仓库设置命令,修改仓库地址。 - 修改 daemon.json 文件
可通过修改 /etc/docker/daemon.json 文件添加多个加速器或更换仓库地址。
/etc/docker/daemon.json 内容
{
"registry-mirrors": ["http://harbor.test.com"], #镜像加速地址
"insecure-registries": ["harbor.test.com","registry.cn-shenzhen.aliyuncs.com"], # 非ssl源仓库,或私库地址
"max-concurrent-downloads": 10
}
daemon.json还可以设置众多参数,如docker的dns地址,防火墙等配置,详情可看官网相应资料链接。
国内加速器地址
https://registry.docker-cn.com
http://hub-mirror.c.163.com
https://3laho3y3.mirror.aliyuncs.com
http://f1361db2.m.daocloud.io
https://mirror.ccs.tencentyun.com
仓库相关操作
- 登录仓库
docker login ----一般连接的 docker hub 地址,填写对应账号密码登录后,可对镜像进行上传下载等操作,不登录也可以。
- 推出仓库
docker logout
- 拉取镜像
docker pull xxx
- 推送镜像
docker push xxx(镜像的REPOSITORY)
基础命令
镜像相关操作
- 查询仓库里的docker镜像
docker search xxx
docker search ubuntu
- 查看本地镜像
docker images
-REPOSITORY:表示镜像的仓库源
-TAG:镜像的标签
-IMAGE ID:镜像ID
-CREATED:镜像创建时间
-SIZE:镜像大小
- 从仓库获取镜像
docker pull ubuntu
对于镜像仓库的网络问题可能导致在拉取镜像过程中失败。但由于docker自身并无重试参数可设置,大多情况下需要自行执行命令重试。可嵌入条件判断语句使其一直执行,直到重试执行成功。
while ! docker pull nginx ; do sleep 3; done ; echo success
此语句会一直重试,直到 docker pull 命令执行成功。可将其整理为脚本,将镜像名称作为脚本输入参数。
- 删除镜像
docker rmi ubuntu
若已用image创建对应的 container,则需要先删除container。
- 更新镜像
docker commit -m="update" -a="test" a1d3c8d8e8 test/ubuntu:v2
-m: 提交的描述信息
-a: 指定镜像作者
a1d3c8d8e8:容器 ID
test/ubuntu:v2: 指定要创建的目标镜像名
- 打标签
标记,并将镜像归入仓库
docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
将镜像ubuntu:15.10标记为 runoob/ubuntu:v3 镜像。
root@runoob:~# docker tag ubuntu:15.10 runoob/ubuntu:v3
root@runoob:~# docker images runoob/ubuntu:v3
REPOSITORY TAG IMAGE ID CREATED SIZE
runoob/ubuntu v3 4e3b13c8a266 3 months ago 136.3 MB
- 查看镜像历史
docker history [option] image_name
-H :以可读的格式打印镜像大小和日期,默认为true;
--no-trunc :显示完整的提交记录;
-q :仅列出提交记录ID。
root@runoob:~# docker history runoob/ubuntu:v3
IMAGE CREATED CREATED BY SIZE COMMENT
4e3b13c8a266 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
<missing> 3 months ago /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$/ 1.863 kB
<missing> 3 months ago /bin/sh -c set -xe && echo '#!/bin/sh' > /u 701 B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:43cb048516c6b80f22 136.3 MB
- 镜像保存/导出
可将镜像保存为 tar 压缩文件进行归档
docker save [OPTIONS] IMAGE [IMAGE...]
-o :输出到的文件。
将镜像 runoob/ubuntu:v3 生成 my_ubuntu_v3.tar 文档
runoob@runoob:~$ docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3
runoob@runoob:~$ ll my_ubuntu_v3.tar
-rw------- 1 runoob runoob 142102016 Jul 11 01:37 my_ubuntu_v3.ta
- 镜像导入
将 tar 压缩文件导入为镜像,对应 docker save 命令
docker load [option] xx.tar
--input , -i : 指定导入的文件,代替 STDIN。
--quiet , -q : 精简输出信息
docker load --input fedora.tar
Loaded image: fedora:rawhide
Loaded image: fedora:20
- 镜像导入(重命名导入的镜像名称)
docker import ubuntu_v1.tar test/ubuntu:v3
- 构建镜像
容器使用
- 创建容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明:
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
--volume , -v: 绑定一个卷
- 执行命令后即推出的容器
docker run --name test1 ubuntu /bin/echo hello
- 创建一个一直在启动状态的容器
docker run -itd ubuntu /bin/bash
容器的创建会在其执行完命令,即不再有服务、命令之类的使用后,即会停止,待有需要时可再次启动容器。
- 容器的状态
docker ps ----只显示启动状态的容器
docker ps -a -----显示所有容器
状态有7种:
created(已创建)
restarting(重启中)
running 或 Up(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)
- 启动
docker start container_id
- 停止/关闭容器
docker stop container_id
- 暂停/恢复容器提供服务
docker pause container_id
docker unpause container_id
- 删除容器
docker rm -f container_id
-f :通过 SIGKILL 信号强制删除一个运行中的容器。
-l :移除容器间的网络连接,而非容器本身。
-v :删除与容器关联的卷。
- 删除所有终止状态的容器
docker container prune
- 容器的导入导出
将容器快照导出到tar文件
docker export container_id > test.tar
将容器快照的tar文件,导入为镜像
docker import test.tar test/xxx:v1
数据卷容器
创建容器时可以通过 -v 参数指定挂载到容器的 目录或数据卷,以实现数据的持续使用或共享。
当将目录或数据挂载到一个容器,而后其他容器在创建时通过 --volumes-from container_name 的方式,挂载上一个容器 , 以实现容器之间的信息传递共享。这个用于共享数据的容器即为数据卷容器。
创建镜像
镜像创建有两种
- 从已有容器中更新镜像并提交
- docker commit
- 使用 Dockerfile 文件指令 build 一个新的镜像
docker commit
docker run -itd ubuntu /bin/bash
docker exec -it container_id /bin/bash
进行所需的操作,如安装服务等
exit
docker commit -m="update" -a="image creator info" container_id new_image_name:version
docker images
可查看到上面创建的新镜像
Dockerfile
在空白目录新建 Dockerfile 文件,而后使用 docker build 命令即可调用 Dockerfile 文件中的指令构建一个新的镜像,实际效果与上面的docker commit 类似,通过配置文件代替手动的命令操作。常用于镜像的定制。示例如下。
Dockerfile 内容:
====
FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
====
docker build -t test:v1 .
. 表示上下文目录,即会打包到image里的目录。默认为Dockerfile所在目录位置。
Dockerfile中可支持以下指令:
- FROM
指定所使用的基础镜像 - RUN
在镜像中执行的命令,与在终端操作shell命令一致,可调用可执行文件 - COPY
从上下文目录中复制文件或目录到容器的指定路径。
COPY [--chown=<user>:<group>] 源路径 目标路径
--chown 可修改复制到容器内的文件的属主与属组。
目标路径若不存在,会自动创建。
- AND
作用与COPY相似,若复制的源文件为 gzip bzip2 xz 等格式,会自动复制并解压到目标目录。如需要自动解压tar文件,可考虑此指令。 - CMD
与RUN指令类似,区别为两者执行的时间点不同。- RUN : docker build 时执行。
- CMD : docker run 时执行。
可用于指定容器启动时 默认要执行的程序, 当程序执行完成,容器结束停止。 CMD 指令会被 docker run 命令参数中的指定运行命令覆盖。即 docker run 时不可输入需要容器执行的命令。
注意: 多 Dockerfile 存在多个 CMD 指令,仅最后一个生效。
格式:
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
推荐使用第二种格式,执行过程比较明确。
第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。
- ENTRYPOINT
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 CMD 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
格式:
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。
示例:
假设已通过 Dockerfile 构建了 nginx:test 镜像:
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
1、不传参运行
$ docker run nginx:test
容器内会默认运行以下命令,启动主进程。
nginx -c /etc/nginx/nginx.conf
2、传参运行
$ docker run nginx:test -c /etc/nginx/new.conf
容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)
nginx -c /etc/nginx/new.conf
- ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
格式:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
以下示例设置 NODE_VERSION = 7.2.0 , 在后续的指令中可以通过 $NODE_VERSION 引用:
ENV NODE_VERSION 7.2.0
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
- ARG
构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。
构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。
格式:
ARG <参数名>[=<默认值>]
- VOLUME
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
作用:
避免重要的数据,因容器重启而丢失,这是非常致命的。
避免容器不断变大。
格式:
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。
- EXPOSE
仅仅只是声明端口。
作用:
帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
格式:
EXPOSE <端口1> [<端口2>...]
- WORKDIR
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
格式:
WORKDIR <工作目录路径>
-USER
用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
格式:
USER <用户名>[:<用户组>]
- HEALTHCHECK
用于指定某个程序或者指令来监控 docker 容器服务的运行状态。
格式:
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。
- ONBUILD
用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这时执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。
格式:
ONBUILD <其它指令>
- LABEL
LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式,语法格式如下:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
比如我们可以添加镜像的作者:
LABEL org.opencontainers.image.authors="runoob"
容器互联访问
端口互联
可实现通过主机特定端口访问容器服务或容器对应端口。
创建容器时,通过 -P 随机端口 或 -p 指定端口 进行容器的端口开放访问。
网络互联
可实现docker容器间的互联。旧式用 --link ,如今使用 --network 代替。
通过 docker network 创建 bridge 类型的网络,创建时指定容器使用的网络。
docker network ls
docker network create -d bridge test-net1
docker run -itd --name test1 --network test-net1 byw/ubuntu_test:v4 /bin/bash
docker run -itd --name test2 --network test-net1 byw/ubuntu_test:v4 /bin/bash
通过此方法指定网络创建的容器,容器之间可相互ping通(通过hostname,由于容器创建时使用的ip随机)
docker network inspect network_name
可查看这个网络的信息,包括哪个容器在这个网络中。
不同的网络,其ip网段有所不同
docker compose
Compose 可用于定义和运行多容器docker应用程序的工具。可使用YML文件配置应用程序需要的所有服务,并调用YML文件创建并启动所有服务。
使用步骤
- Dockerfile定义应用程序的环境
- docker-compose.yml 定义构成应用程序的服务
- docker-compose up 启动并运行应用程序
Compose安装
- 最新发行的版本地址
https://github.com/docker/compose/releases。
- 安装命令
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
要安装其他版本的 Compose,请替换 1.24.1。
将可执行权限应用于二进制文件:
sudo chmod +x /usr/local/bin/docker-compose
创建软链:
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功:
docker-compose --version
注意: 对于 alpine 系统,需要以下依赖包: py-pip,python-dev,libffi-dev,openssl-dev,gcc,libc-dev,和 make。
- compose 命令
启动应用程序,并在后台执行,在 docker-compose.yml文件目录执行
docker-compose up -d
- docker-compose.yml
详细配置参数可看 Docker Compose | 菜鸟教程 (runoob.com)
# yaml 配置实例
version: '3' ----------指定本yml文件制定所依从的compose版本
services:
web:
build: . ----------指定构建镜像的上下文路径。或作为具有在上下文指定的路径对象,及可选的Dockerfile 和 args
==============
build:
context: ./dir ----------上下文路径
dockerfile: Dockerfile-alternate ----------- 指定构建镜像的 Dockerfile 文件名
args: ----------------添加构建参数(只可在构建过程中访问的环境变量)
buildno: 1
labels: -----------------设置构建镜像的标签信息
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
target: prod -------------多层构建,可指定构建哪一层
==============
ports:
- "5000:5000" ------------指定端口
volumes: --------------指定挂载的数据卷
- .:/code
- logvolume01:/var/log
links: -----------指定可进行通讯的容器别名
- redis
depends_on: ------------设置依赖关系,包括容器创建、启动、停止
- db
- redis
redis:
image: redis ------------指定容器所使用的镜像
container_name: my-web-container ---------指定创建的容器名称
volumes: --------------将主机的数据卷或文件挂载到容器里
logvolume01: {}
- "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
- "/localhost/data:/var/lib/postgresql/data"
devices: -------------------指定设备映射列表
- "/dev/ttyUSB0:/dev/ttyUSB0"
dns: -----------------------自定义 DNS 服务器,可以是单个值或列表的多个值
- 8.8.8.8
- 9.9.9.9
dns_search: ---------------------自定义 DNS 搜索域。可以是单个值或列表
- dc1.example.com
- dc2.example.com
entrypoint: /code/entrypoint.sh --------------覆盖容器默认的 entrypoint
=======
也可以是以下格式:
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: ----------------从文件添加环境变量。可以是单个值或列表的多个值
- ./common.env
- ./apps/web.env
- /opt/secrets.env
environment: ---------------------添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
RACK_ENV: development
SHOW: 'true'
expose: ----------------------------暴露端口,但不映射到宿主机,只被连接的服务访问
- "3000"
- "8000"
extra_hosts: --------------------------------以上会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
healthcheck: --------------------用于检测docker服务是否正常运行
test: ["CMD", "curl", "-f", "http://localhost"] # 设置检测程序
interval: 1m30s # 设置检测间隔
timeout: 10s # 设置检测超时时间
retries: 3 # 设置重试次数
start_period: 40s # 启动后,多少秒开始启动检测程序
=========
=========
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。
=========
=========
sysctls
设置容器中的内核参数,可以使用数组或字典格式。
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
======
tmpfs
在容器内安装一个临时文件系统。可以是单个值或列表的多个值。
tmpfs:
- /run
- /tmp
=====
ulimits
覆盖容器默认的 ulimit。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
======