docker,dockerfile,docker-compose在windows10下的安装与使用

docker在windows10下的安装与使用

本人使用的是 win10专业版 + Hyper-V 搭建的docker环境

一、 安装配置

1. docker-desktop下载:

https://hub.docker.com/ 去官网下载docker-desktop版本。

2. docker desktop installer安装:

执行安装程序,一步一步安装完成即可。

3. 配置国内镜像源:

右下角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",
  ],
}

4. 安装git bash作为docker的命令行工具(cmd或powershell启动容器会有些问题)

https://git-scm.com/ 下载安装git

二、 常用命令

  1. docker version 检查docker版本

  2. docker search xxx 搜索xxx镜像

  3. docker pull xxx 拉取镜像xxx

  4. docker images 查看镜像列表

  5. docker rmi 镜像id 删除一个镜像

  6. docker start/stop/restart/kill 容器id 启动/停止/重启/杀掉容器

  7. docker logs 容器id/名称 查看容器日志

  8. docker rm 容器1 容器2: 删除一个或多个容器

  9. docker rm -f 容器1 容器2: 通过 SIGKILL 信号强制删除一个运行中的容器

  10. docker rm -l 容器1 容器2: 移除容器间的网络连接,而非容器本身。

  11. docker rm -v 容器1 容器2: 删除与容器关联的卷

  12. docker rm $(docker ps -a -q): 删除所有已经停止的容器

  13. docker exec -it 容器id/名称 bash 进入运行中的容器

  14. 启动容器: 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
  1. 查看容器: docker ps [OPTIONS]
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:  显示总的文件大小
  1. docker pause 容器id/名称: 暂停容器中所有的进程。

  2. docker unpause 容器id/名称: 恢复容器中所有的进程。

  3. 查看容器中运行的进程信息,支持 ps 命令参数:

**docker top **[OPTIONS] CONTAINER [ps OPTIONS]

  1. 查看所有运行容器的进程信息

for i in \docker ps |grep Up|awk ‘{print $1}’`;do echo \ &&docker top $i; done`

  1. 用于容器与主机之间的数据拷贝:

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

  1. 列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口:

docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]

例如: docker port 容器id/名称 查看某容器端口映射情况

三、 Docker Dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

以定制一个 nginx 镜像为例:

FROM nginx
RUN echo '本地构建的nginx镜像' > /usr/share/nginx/html/index.html
  1. FROM:基于哪个镜像 上面是nginx镜像。

  2. 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
  1. COPY: 复制指令,从上下文目录中复制文件或目录到容器中指定路径
COPY [--chown=:] <源路径1>...  <目标路径>
COPY [--chown=:] ["<源路径1>",...  "<目标路径>"]

	[--chown=:]:可选参数,用户改变复制到容器内文件的拥有者和属组。
	<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。如`COPY hom* /mydir/`、 `COPY hom?.txt /mydir/`
	<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
  1. ADD: 和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似, 不同点:
ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。

ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。
  1. CMD: 类似于 RUN 指令,用于运行程序
  • CMD 在docker run 时运行

  • RUN 是在 docker build

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效

CMD  
CMD ["<可执行文件或命令>","","",...] 
CMD ["","",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
  1. 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

  1. ENV:设置环境变量,定义了环境变量
ENV  
ENV = =...
  1. VOLUME: 定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷

作用:

  • 避免重要的数据,因容器重启而丢失,这是非常致命的。

  • 避免容器不断变大

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点

  1. EXPOSE: 声明端口

作用:

  • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。

  • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

格式: EXPOSE <端口1> [<端口2>...]

  1. WORKDIR: 指定工作目录(必须是提前创建好的)

格式: WORKDIR <工作目录路径>

  1. USER:

用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

格式: USER <用户名>[:<用户组>]

  1. HEALTHCHECK: 用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

格式:

HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。
  1. ONBUILD: 延迟构建命令的执行

简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这是执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。

格式: ONBUILD <其它指令>

构建镜像

docker build -t nginx:test .

四、Docker Compose:

Docker-Compose项目实现对Docker容器集群的快速编排

容器分为三层,分别是工程(project),服务(service)以及容器(container)

安装

  • 我装的docker-desktop 自带了docker-compose ,如果没有,可以在python环境下使用 pip install docker-compose 安装

查看安装的版本: docker-compose --version

卸载: pip uninstall docker-compose

常用命令

  1. docker-compose [-f …] [options] [COMMAND] [ARGS…]
options选项:
	-f --file 				FILE指定Compose模板文件,默认为docker-compose.yml
	-p --project-name NAME 	指定项目名称,默认使用当前所在目录为项目名
	--verbose  				输出更多调试信息
	-v,-version 			打印版本并退出
	--log-level LEVEL 		定义日志等级(DEBUG, INFO, WARNING, ERROR, CRITICAL)
  1. docker-compose up [options] [–scale SERVICE=NUM…] [SERVICE…]
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文件中定义的容器
  1. docker-compose ps [options] [SERVICE…]

列出项目中所有的容器

  1. docker-compose stop/start/restart [options] [SERVICE…]

停止/开启/重启

options选项:-t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)

  1. docker-compose -h

查看帮助

  1. docker-compose down [options] 停止和删除容器、网络、卷、镜像。
–rmi type		删除镜像,类型必须是:all,删除compose文件中定义的所有镜像;local,删除镜像名为空的镜像
-v, –volumes	删除已经在compose文件中定义的和匿名的附在容器上的数据卷
–remove-orphans	删除服务中没有在compose中定义的容器
  1. docker-compose logs [options] [SERVICE…] 查看服务容器的输出

  2. 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变量
	
  1. docker-compose pull [options] [SERVICE…] 拉取服务依赖的镜像
options选项:
	–ignore-pull-failures,忽略拉取镜像过程中的错误
	–parallel,多个镜像同时拉取
	–quiet,拉取镜像过程中不打印进度信息
  1. docker-compose rm [options] [SERVICE…] 删除所有(停止状态的)服务容器
options选项:
	–f, –force,强制直接删除,包括非停止状态的容器
	-v,删除容器所挂载的数据卷
  1. docker-compose run [options] [-v VOLUME…] [-p PORT…] [-e KEY=VAL…] SERVICE [COMMAND] [ARGS…]

在指定服务上执行一个命令。

如: docker-compose run centos ping www.baidu.com 在指定容器上执行一个ping命令。

  1. docker-compose scale web=3 db=2 设置指定服务运行的容器个数。通过service=num的参数来设置数量

  2. docker-compose pause/uppause [SERVICE…] 暂停/恢复一个服务容器

  3. docker-compose kill [options] [SERVICE…] 强制停止服务容器

  4. docker-compose config [options] 验证并查看compose文件配置

options选项:
	–resolve-image-digests 	将镜像标签标记为摘要
	-q, –quiet 				只验证配置,不输出。 当配置正确时,不输出任何内容,当文件配置错误,输出错误信息
	–services 				打印服务名,一行一个
	–volumes 				打印数据卷名,一行一个
  1. docker-compose create [options] [SERVICE…] 为服务创建容器
options选项:
	–force-recreate:重新创建容器,即使配置和镜像没有改变,不兼容–no-recreate参数
	–no-recreate:如果容器已经存在,不需要重新创建,不兼容–force-recreate参数
	–no-build:不创建镜像,即使缺失
	–build:创建容器前  ,生成镜像
  1. docker-compose exec [options] SERVICE COMMAND [ARGS…] 进入某个容器
options选项:
	-d 分离模式,后台运行命令。
	–privileged 获取特权。
	–user USER 指定运行的用户。
	-T 禁用分配TTY,默认docker-compose exec分配TTY。
	–index=index,当一个服务拥有多个容器时,可通过该参数登陆到该服务下的任何服务,例如:docker-compose exec –index=1 web /bin/bash ,web服务中包含多个容器
  1. docker-compose port [options] SERVICE PRIVATE_PORT

显示某个容器端口所映射的公共端口

options选项:
	–protocol=proto,指定端口协议,TCP(默认值)或者UDP
	–index=index,如果同意服务存在多个容器,指定命令对象容器的序号(默认为1)

Docker-compose模板文件

Compose允许用户通过一个docker-compose.**yml模板文件(YAML 格式)**来定义一组相关联的应用容器为一个项目(project)。

Compose模板文件是一个定义服务、网络和卷的YAML文件 可以使用.yml或.yaml作为文件扩展名

Compose模板文件包含versionservices、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
	
  1. version: 目前有三个版本分别为Version 1/2/3, Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1将来会被弃用。

  2. image: 指定服务的镜像名称或镜像ID

  3. build: 指定服务镜像 基于Dockerfile文件

  • context: 可以是Dockerfile的文件路径,也可以是到链接到git仓库的url,当提供的值是相对路径时,被解析为相对于撰写文件的路径,此目录也是发送到Docker守护进程的context

  • dockerfile: dockerfile文件名

  1. commond: 使用command可以覆盖容器启动后默认执行的命令。

如:command: bundle exec thin -p 3000

  1. container_name: Compose的容器名称格式是:<项目名称><服务名称><序号>

如: container_name: app

  1. depends_on 用于解决容器的依赖、启动先后的问题
	depends_on:
		- db
  1. pid:

pid: "host" 将PID模式设置为主机PID模式,跟主机系统共享进程命名空间。容器使用pid标签将能够访问和操纵其他容器和宿主机的名称空间。

  1. ports: ports用于映射端口的标签
ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:9001:9001"
  1. extra_hosts: 添加主机名的标签,会在/etc/hosts文件中添加一些记录
extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"
  1. volumes: 挂载一个目录或者一个已存在的数据卷容器

[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
  1. volumes_from: 从另一个服务或容器挂载其数据卷
volumes_from:
   - service_name   
     - container_name
  1. dns: 自定义DNS服务器。可以是一个值,也可以是一个列表。
dns:8.8.8.8
dns:
    - 8.8.8.8   
    - 9.9.9.9
  1. expose: 暴露端口
expose:
    - "80"
    - "3306"
  1. links: 链接到其它服务中的容器
links:
    - db
    - db:database
    - redis
  1. net: 设置网络模式
	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

你可能感兴趣的:(docker)