本人使用的是 win10专业版 + Hyper-V 搭建的docker环境
https://hub.docker.com/
去官网下载docker-desktop版本。
执行安装程序,一步一步安装完成即可。
右下角docker图标 右键 -> ‘settings’ -> ‘Docker Engine’: 在右侧的编辑框内输入:
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://registry.docker-cn.com",
"https://3laho3y3.mirror.aliyuncs.com",
"http://f1361db2.m.daocloud.io",
"https://mirror.ccs.tencentyun.com",
],
}
https://git-scm.com/
下载安装git
docker version 检查docker版本
docker search xxx 搜索xxx镜像
docker pull xxx 拉取镜像xxx
docker images 查看镜像列表
docker rmi 镜像id 删除一个镜像
docker start/stop/restart/kill 容器id 启动/停止/重启/杀掉容器
docker logs 容器id/名称 查看容器日志
docker rm 容器1 容器2: 删除一个或多个容器
docker rm -f 容器1 容器2: 通过 SIGKILL 信号强制删除一个运行中的容器
docker rm -l 容器1 容器2: 移除容器间的网络连接,而非容器本身。
docker rm -v 容器1 容器2: 删除与容器关联的卷
docker rm $(docker ps -a -q): 删除所有已经停止的容器
docker exec -it 容器id/名称 bash 进入运行中的容器
启动容器: docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
OPTIONS参数:
-a 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d 后台运行容器,并返回容器ID
-e env="product" 设置环境变量;
-h, --hostname string 指定容器的hostname
-i 以交互模式运行容器,通常与 -t 同时使用
-m 设置容器使用内存最大值
-P(大写) 随机端口映射,容器内部端口随机映射到主机的端口
-p(小写) 指定端口映射,格式为:主机(宿主)端口:容器端口
-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-v, --volume 绑定一个卷
-w, --workdir string 容器内的工作目录
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
--dns 8.8.8.8 指定容器使用的DNS服务器,默认和宿主一致
--dns-search example.com 指定容器DNS搜索域名,默认和宿主一致
--env-file list 从指定文件读入环境变量
--expose list 开放一个端口或一组端口
--link list 添加链接到另一个容器
--name xxx 为容器指定一个名称
--privileged 将扩展权限授予此容器
看些实例:
docker run --name mynginx -d nginx:latest
docker run -P -d nginx:latest
docker run -p 80:80 -v /data:/data -d nginx:latest
docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
docker run -it nginx:latest /bin/bash
OPTIONS参数:
-a :显示所有的容器,包括未运行的。
-f :根据条件过滤显示的内容。
-l :显示最近创建的容器。
-n :列出最近创建的n个容器。
-q :静默模式,只显示容器编号。
-s :显示总的文件大小。
--format :指定返回值的模板文件。
--no-trunc :不截断输出。
返回示例说明:
$ docker ps -as
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
73012d245222 t_app "/bin/sh -c 'sh /app…" 3 days ago Up 10 hours 0.0.0.0:5030->5030/tcp t_app_1 4.62MB (virtual 1.01GB)
71c0a1d902c0 t_db "docker-entrypoint.s…" 3 days ago Up 10 hours 33060/tcp, 0.0.0.0:7002->3306/tcp t_db_1 4B (virtual 448MB)
字段说明:
- CONTAINER ID: 容器ID
- IMAGE: 使用的镜像
- COMMAND: 启动容器时运行的命令
- CREATED: 容器的创建时间
- STATUS: 容器状态(created-已创建, restarting-重启中, running-运行中, removing-迁移中, paused-暂停, exited-停止, dead-死亡)
- PORTS: 容器的端口信息和使用的连接类型(tcp/udp)
- NAMES: 自动分配的容器名称
- SIZE: 显示总的文件大小
docker pause 容器id/名称: 暂停容器中所有的进程。
docker unpause 容器id/名称: 恢复容器中所有的进程。
查看容器中运行的进程信息,支持 ps 命令参数:
**docker top **[OPTIONS] CONTAINER [ps OPTIONS]
for i in \
docker ps |grep Up|awk ‘{print $1}’`;do echo \ &&docker top $i; done`
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]
例如: docker port 容器id/名称 查看某容器端口映射情况
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
以定制一个 nginx 镜像为例:
FROM nginx
RUN echo '本地构建的nginx镜像' > /usr/share/nginx/html/index.html
FROM:基于哪个镜像 上面是nginx镜像。
RUN: 用于执行后面跟着的命令行命令
shell格式:
RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。
exec格式:
RUN ["可执行文件", "参数1", "参数2"]
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大
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 层镜像。可简化为以下格式(只创建1层镜像):
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
COPY [--chown=:] <源路径1>... <目标路径>
COPY [--chown=:] ["<源路径1>",... "<目标路径>"]
[--chown=:]:可选参数,用户改变复制到容器内文件的拥有者和属组。
<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。如`COPY hom* /mydir/`、 `COPY hom?.txt /mydir/`
<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
CMD 在docker run 时运行。
RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
CMD
CMD ["<可执行文件或命令>","","",...]
CMD ["","",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
ENTRYPOINT ["
可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
传参运行: docker run nginx:test -c /etc/nginx/new.conf
ENV
ENV = =...
作用:
避免重要的数据,因容器重启而丢失,这是非常致命的。
避免容器不断变大
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。
作用:
帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
格式: EXPOSE <端口1> [<端口2>...]
格式: WORKDIR <工作目录路径>
用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。
格式: USER <用户名>[:<用户组>]
格式:
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。
简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这是执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。
格式: ONBUILD <其它指令>
构建镜像
docker build -t nginx:test .
Docker-Compose项目实现对Docker容器集群的快速编排
容器分为三层,分别是工程(project),服务(service)以及容器(container)
安装:
pip install docker-compose
安装查看安装的版本: docker-compose --version
卸载: pip uninstall docker-compose
options选项:
-f --file FILE指定Compose模板文件,默认为docker-compose.yml
-p --project-name NAME 指定项目名称,默认使用当前所在目录为项目名
--verbose 输出更多调试信息
-v,-version 打印版本并退出
--log-level LEVEL 定义日志等级(DEBUG, INFO, WARNING, ERROR, CRITICAL)
options选项:
-d 在后台运行服务容器
--force-recreate 强制重新创建容器,不能与-no-recreate同时使用
–build 在启动容器前构建服务镜像
-no-color 不是有颜色来区分不同的服务的控制输出
-no-deps 不启动服务所链接的容器
–no-recreate 如果容器已经存在,则不重新创建,不能与–force-recreate同时使用
–no-build 不自动构建缺失的服务镜像
–abort-on-container-exit 停止所有容器,如果任何一个容器被停止,不能与-d同时使用
-t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
–remove-orphans 删除服务中没有在compose文件中定义的容器
列出项目中所有的容器
停止/开启/重启
options选项:-t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
查看帮助
–rmi type 删除镜像,类型必须是:all,删除compose文件中定义的所有镜像;local,删除镜像名为空的镜像
-v, –volumes 删除已经在compose文件中定义的和匿名的附在容器上的数据卷
–remove-orphans 删除服务中没有在compose中定义的容器
docker-compose logs [options] [SERVICE…] 查看服务容器的输出
docker-compose build [options] [–build-arg key=val…] [SERVICE…] 构建(重新构建)项目中的服务容器
options选项:
–compress 通过gzip压缩构建上下环境
–force-rm 删除构建过程中的临时容器
–no-cache 构建镜像过程中不使用缓存
–pull 始终尝试通过拉取操作来获取更新版本的镜像
-m, –memory MEM为构建的容器设置内存大小
–build-arg key=val为服务设置build-time变量
options选项:
–ignore-pull-failures,忽略拉取镜像过程中的错误
–parallel,多个镜像同时拉取
–quiet,拉取镜像过程中不打印进度信息
options选项:
–f, –force,强制直接删除,包括非停止状态的容器
-v,删除容器所挂载的数据卷
在指定服务上执行一个命令。
如: docker-compose run centos ping www.baidu.com
在指定容器上执行一个ping命令。
docker-compose scale web=3 db=2 设置指定服务运行的容器个数。通过service=num的参数来设置数量
docker-compose pause/uppause [SERVICE…] 暂停/恢复一个服务容器
docker-compose kill [options] [SERVICE…] 强制停止服务容器
docker-compose config [options] 验证并查看compose文件配置
options选项:
–resolve-image-digests 将镜像标签标记为摘要
-q, –quiet 只验证配置,不输出。 当配置正确时,不输出任何内容,当文件配置错误,输出错误信息
–services 打印服务名,一行一个
–volumes 打印数据卷名,一行一个
options选项:
–force-recreate:重新创建容器,即使配置和镜像没有改变,不兼容–no-recreate参数
–no-recreate:如果容器已经存在,不需要重新创建,不兼容–force-recreate参数
–no-build:不创建镜像,即使缺失
–build:创建容器前 ,生成镜像
options选项:
-d 分离模式,后台运行命令。
–privileged 获取特权。
–user USER 指定运行的用户。
-T 禁用分配TTY,默认docker-compose exec分配TTY。
–index=index,当一个服务拥有多个容器时,可通过该参数登陆到该服务下的任何服务,例如:docker-compose exec –index=1 web /bin/bash ,web服务中包含多个容器
显示某个容器端口所映射的公共端口
options选项:
–protocol=proto,指定端口协议,TCP(默认值)或者UDP
–index=index,如果同意服务存在多个容器,指定命令对象容器的序号(默认为1)
Compose允许用户通过一个docker-compose.**yml模板文件(YAML 格式)**来定义一组相关联的应用容器为一个项目(project)。
Compose模板文件是一个定义服务、网络和卷的YAML文件 可以使用.yml或.yaml作为文件扩展名
Compose模板文件包含version、services、networks 三大部分
示例:
version: '2' #目前有三个版本分别为Version 1/2/3, Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1将来会被弃用。
services:
web: # 服务名称
# image: hello-world #指定服务的镜像名称或镜像ID
build: # 指定服务镜像 基于Dockerfile文件
context: ./dir # 可以是Dockerfile的文件路径,也可以是到链接到git仓库的url,当提供的值是相对路径时,被解析为相对于撰写文件的路径,此目录也是发送到Docker守护进程的context
dockerfile: path/of/Dockerfile
ports:
- 8080
networks:
- front-tier
- back-tier
redis:
image: redis
links:
- web
networks:
- back-tier
lb:
image: dockercloud/haproxy
ports:
- 80:80
links:
- web
networks:
- front-tier
- back-tier
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
front-tier:
driver: bridge
back-tier:
driver: bridge
version: 目前有三个版本分别为Version 1/2/3, Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1将来会被弃用。
image: 指定服务的镜像名称或镜像ID
build: 指定服务镜像 基于Dockerfile文件
context: 可以是Dockerfile的文件路径,也可以是到链接到git仓库的url,当提供的值是相对路径时,被解析为相对于撰写文件的路径,此目录也是发送到Docker守护进程的context
dockerfile: dockerfile文件名
如:command: bundle exec thin -p 3000
如: container_name: app
depends_on:
- db
pid: "host"
将PID模式设置为主机PID模式,跟主机系统共享进程命名空间。容器使用pid标签将能够访问和操纵其他容器和宿主机的名称空间。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:9001:9001"
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
[HOST:CONTAINER]
[HOST:CONTAINER:ro]
数据卷是只读的,可以有效保护宿主机的文件系统
volumes:
// 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。
- /var/lib/mysql
// 使用绝对路径挂载数据卷
- /opt/data:/var/lib/mysql
// 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。
- ./cache:/tmp/cache
// 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。
- ~/configs:/etc/configs/:ro
// 已经存在的命名的数据卷。
- datavolume:/var/lib/mysql
volumes_from:
- service_name
- container_name
dns:8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
expose:
- "80"
- "3306"
links:
- db
- db:database
- redis
net: "bridge"
net: "none"
net: "host"
docker-compose.yml 指定了3个web服务
version: '2'
services:
web1:
image: nginx
ports:
- "80:80"
container_name: "web1"
networks:
- dev
web2:
image: nginx
ports:
- "81:80"
container_name: "web2"
networks:
- dev
- pro
web3:
image: nginx
ports:
- "82:80"
container_name: "web3"
networks:
- pro
networks:
dev:
driver: bridge
pro:
driver: bridge
启动: docker-compose up -d