Linux Docker安装 使用 Dockerfile

Linux Docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker简介

一、Docker 安装

1、Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。通过 uname -r 命令查看你当前的内核版本

uname -r

2、(使用 root 权限登录 Centos)确保 yum 包更新到最新。

 sudo yum update

3、卸载旧版本(如果安装过旧版本的话)

sudo yum remove docker  docker-common docker-selinux docker-engine

4、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

5、设置yum源

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

6、可以查看所有仓库中所有docker版本,并选择特定版本安装

yum list docker-ce --showduplicates | sort -r

7、安装docker

sudo yum install docker-ce

8、启动并加入开机启动

sudo systemctl start docker
sudo systemctl restart docker    # 重启 
sudo systemctl status docker #  查看状态 
sudo systemctl stop docker  # 停止 
sudo systemctl enable docker

9、将用户移动到docker组里

sudo usermod -G docker $USER //将当前用户添加到docker组中.
docker version # 查看版本

二、docker 基本命令详解

1.查找镜像

docker search nginx

2.拉取镜像

docker pull nginx

3.运行镜像并进入镜像

docker run - 运行一个容器 -t - 分配一个(伪)tty (link is external) -i - 交互模式 (so we can interact with it) nginx- 使用 nginx 基础镜像 /bin/bash - 运行命令 bash shell

docker run -i -t nginx /bin/bash

4.docker 命令帮助

docker   # docker 命令帮助
Commands:
    attach  # 当前 shell 下 attach 连接指定运行镜像
    build   # 通过 Dockerfile 定制镜像
    commit  # 提交当前容器为新的镜像
    cp      # 从容器中拷贝指定文件或者目录到宿主机中
    create  # 创建一个新的容器,同 run,但不启动容器
    diff    # 查看 docker 容器变化,检查容器文件系统上文件或目录的更改 A	添加了文件或目录,D	文件或目录已删除,C 文件或目录已更改
    events  # 从 docker 服务获取容器实时事件
    exec    # 在已存在的容器上运行命令
    export  # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
    history # 展示一个镜像形成历史
    images  # 列出系统当前镜像
    import  # 从tar包中的内容创建一个新的文件系统映像[对应 export]
    info    # 显示系统相关信息
    inspect # 查看容器详细信息
    kill    # kill 指定 docker 容器
    load    # 从一个 tar 包中加载一个镜像[对应 save]
    login   # 注册或者登陆一个 docker 源服务器
    logout  # 从当前 Docker registry 退出
    logs    # 输出当前容器日志信息 -f 动态查看
    port    # 查看映射端口对应的容器内部源端口
    pause   # 暂停容器
    ps      # 列出容器列表
    pull    # 从docker镜像源服务器拉取指定镜像或者库镜像
    push    # 推送指定镜像或者库镜像至docker源服务器
    restart # 重启运行的容器
    rm      # 移除一个或者多个容器
    rmi     # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
    run     # 创建一个新的容器并运行一个命令
    save    # 保存一个镜像为一个 tar 包[对应 load]
    search  # 在 docker hub 中搜索镜像
    start   # 启动容器
    stop    # 停止容器
    tag     # 给源中镜像打标签
    top     # 查看容器中运行的进程信息
    unpause # 取消暂停容器
    version # 查看 docker 版本号
    wait    # 截取容器停止时的退出状态值

5. docker option

Usage of docker:
  --api-enable-cors=false  # 远程 API 中开启 CORS 头
  -b, --bridge=""   # 桥接网络use 'none' to disable container networking
  --bip=""    # 和 -b 选项不兼容,具体没有测试过
  -d, --daemon=false   # daemon 模式
  -D, --debug=false   # debug 模式
  --dns=[]    # 强制 docker 使用指定 dns 服务器
  --dns-search=[]   # 强制 docker 使用指定 dns 搜索域
  -e, --exec-driver="native"  # 强制 docker 运行时使用指定执行驱动器
  --fixed-cidr=""            IPv4 subnet for fixed IPs (ex: 10.20.0.0/16)this subnet must be nested in the bridge subnet (which is defined by -b or --bip)
  -G, --group="docker"       Group to assign the unix socket specified by -H when running in daemon mode
                                           use '' (the empty string) to disable setting of a group
  -g, --graph="/var/lib/docker"  # 容器运行的根目录路径
  -H, --host=[] # daemon 模式下 docker 指定绑定方式[tcp or 本地 socket]
                                           specified using one or more tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd.
  --icc=true  # 跨容器通信
  --insecure-registry=[]                 Enable insecure communication with specified registries (no certificate verification for HTTPS and enable HTTP fallback) (e.g., localhost:5000 or 10.20.0.0/16)
  --ip="0.0.0.0"   # 指定监听地址,默认所有 ip
  --ip-forward=true  # 开启转发
  --ip-masq=true         Enable IP masquerading for bridge's IP range
  --iptables=true   # 添加对应 iptables 规则
  --mtu=0        # 设置网络 mtu
                                           if no value is provided: default to the default route MTU or 1500 if no default route is available
  -p, --pidfile="/var/run/docker.pid"    # 指定 pid 文件位置
  --registry-mirror=[]        Specify a preferred Docker registry mirror                  
  -s, --storage-driver=""    # 强制 docker 运行时使用指定存储驱动
  --selinux-enabled=false     # 开启 selinux 支持
  --storage-opt=[]           # 设置存储驱动选项
  --tls=false               # 开启 tls
  --tlscacert="/root/.docker/ca.pem"     Trust only remotes providing a certificate signed by the CA given here
  --tlscert="/root/.docker/cert.pem"    # tls 证书文件位置
  --tlskey="/root/.docker/key.pem"       # tls key 文件位置
  --tlsverify=false                      # 使用 tls 并确认远程控制主机
  -v, --version=false            # 输出 docker 版本信息

6.docker run

docker run --help
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container
  -a, --attach=[] Attach to stdin, stdout or stderr.
  -c, --cpu-shares=0 # 设置 cpu 使用权重 --cap-add=[] Add Linux capabilities
  --cap-drop=[] Drop Linux capabilities
  --cidfile=""  # 把容器 id 写入到指定文件 
  --cpuset="" # cpu 绑定 -d, --detach=false Detached mode: Run container in the background, print new container id # 后台运行容器 
  --device=[] Add a host device to the container (e.g. --device=/dev/sdc:/dev/xvdc) 
  --dns=[]  # 设置 dns 
  --dns-search=[]  # 设置 dns 域搜索 
  -e, --env=[] # 定义环境变量 
  --entrypoint="" Overwrite the default entrypoint of the image # ? 
  --env-file=[] # 从指定文件读取变量值 
  --expose=[] # 指定对外提供服务端口 
  -h, --hostname=""  # 设置容器主机名 
  -i, --interactive=false # 保持标准输出开启即使没有 attached 
  --link=[]  # 添加链接到另外一个容器 
  --lxc-conf=[] (lxc exec-driver only) Add custom lxc options 
  --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1" 
  -m, --memory="" # 内存限制 
  --name=""  # 设置容器名 
  --net="bridge"  # 设置容器网络模式 'bridge': creates a new network stack for the container on the docker bridge 'none': no networking for this container 'container:': reuses another container network stack 'host': use the host network stack inside the container.  Note: the host mode gives the container full access to local system services such as D-bus and is therefore considered insecure.
  -P, --publish-all=false  # 自动映射容器对外提供服务的端口 
  -p, --publish=[] # 指定端口映射  format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort  (use 'docker port' to see the actual mapping) 
  --privileged=false  # 提供更多的权限给容器 
  --restart="" Restart policy to apply when a container exits (no, on-failure[:max-retry], always) 
  --rm=false # 如果容器退出自动移除和 -d 选项冲突 --security-opt=[] Security Options
  --sig-proxy=true Proxify received signals to the process (even in non-tty mode). SIGCHLD is not proxied.
  -t, --tty=false  # 分配伪终端 
  -u, --user=""  # 指定运行容器的用户 uid 或者用户名 
  -v, --volume=[]  # 挂载卷 
  --volumes-from=[] # 从指定容器挂载卷 
  -w, --workdir=""  # 指定容器工作目录 

7.命令举例

docker ps:列出运行中的容器
docker ps -a :列出所有的容器
docker stop 容器id:停止容器
docker kill 容器id:强制停止容器
docker start 容器id:启动已停止的容器
docker inspect 容器id:查看容器的所有信息
docker container logs 容器id:查看容器日志
docker top 容器id:查看容器里的进程
docker exec -it 容器id /bin/bash:进入容器
exit:退出容器
docker rm 容器id:删除已停止的容器
docker rm -f 容器id:删除正在运行的容器

三、docker安装镜像并挂载目录文件

以nginx为例:

1.在Docker下载Nginx镜像

docker pull nginx ##拉取镜像
docker images ##查看镜像

2.创建挂载目录

mkdir nginx
cd nginx
mkdir conf.d logs html

3.挂载并启动nginx

命令说明: –privileged=true 配置了nginx.conf的外部挂载 之后可能导致nginx不能启动,使用该命令; -v /home/dabing/conf.d/default.conf:/etc/nginx/conf.d/default.conf 挂载默认配置文件 -v /home/dabing/conf/nginx.conf:/etc/nginx/nginx.conf 挂载nginx.conf文件 -v /home/dabing/logs:/var/log/nginx 挂载日志目录 -v /home/dabing/html:/usr/share/nginx/html 挂载html目录

docker run -p 80:80 --name nginx1 --privileged=true -v /home/dabing/nginx/html:/usr/share/nginx/html -v /home/dabing/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/dabing/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf -v /home/dabing/nginx/logs:/var/log/nginx -d nginx

4.docker进入容器

docker exec -it 775c7c9ee1e1 /bin/bash  

四、Dockerfile

Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。

1.docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。

docker build -f /path/to/a/Dockerfile

2.Dockerfile的基本结构

Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。

3.Dockerfile文件说明

Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。

1.FROM:指定基础镜像,必须为第一个命令

格式:
  FROM <image>
  FROM <image>:<tag>
  FROM <image>@<digest>
示例:
  FROM mysql:5.7
注:
  tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

2.MAINTAINER: 维护者信息

格式:
    MAINTAINER <name>
示例:
    MAINTAINER Jasper Xu
    MAINTAINER [email protected]
    MAINTAINER Jasper Xu <[email protected]>

3.RUN:构建镜像时执行的命令

RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
shell执行
格式:
    RUN <command>
exec执行
格式:
    RUN ["executable", "param1", "param2"]
示例:
    RUN ["executable", "param1", "param2"]
    RUN apk update
    RUN ["/etc/execfile", "arg1", "arg1"]
注:
  RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache

4.ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget

格式:
    ADD <src>... <dest>
    ADD ["",... ""] 用于支持包含空格的路径
示例:
    ADD hom* /mydir/          # 添加所有以"hom"开头的文件
    ADD hom?.txt /mydir/      # ? 替代一个单字符,例如:"home.txt"
    ADD test relativeDir/     # 添加 "test" 到 `WORKDIR`/relativeDir/
    ADD test /absoluteDir/    # 添加 "test" 到 /absoluteDir/

5.COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源

6.CMD:构建容器后调用,也就是在容器启动时才进行调用。

格式:
    CMD ["executable","param1","param2"] (执行可执行文件,优先)
    CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
    CMD command param1 param2 (执行shell内部命令)
示例:
    CMD echo "This is a test." | wc -
    CMD ["/usr/bin/wc","--help"]
注:
   CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

7.ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。

格式:
    ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
    ENTRYPOINT command param1 param2 (shell内部命令)
示例:
    FROM ubuntu
    ENTRYPOINT ["top", "-b"]
    CMD ["-c"]
注:
   ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。

8.LABEL:用于为镜像添加元数据

格式:
    LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:
  LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
注:
  使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。

9.ENV:设置环境变量

格式:
    ENV <key> <value>  #之后的所有内容均会被视为其的组成部分,因此,一次只能设置一个变量
    ENV <key>=<value> ...  #可以设置多个变量,每个变量为一个"="的键值对,如果中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
示例:
    ENV myName John Doe
    ENV myDog Rex The Dog
    ENV myCat=fluffy

10.EXPOSE:指定于外界交互的端口

格式:
    EXPOSE <port> [<port>...]
示例:
    EXPOSE 80 443
    EXPOSE 8080
    EXPOSE 11211/tcp 11211/udp
注:
  EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口

11.VOLUME:用于指定持久化目录

格式:
    VOLUME ["/path/to/dir"]
示例:
    VOLUME ["/data"]
    VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
注:
  一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
1 卷可以容器间共享和重用
2 容器并不一定要和其它容器共享卷
3 修改卷后会立即生效
4 对卷的修改不会对镜像产生影响
5 卷会一直存在,直到没有任何容器在使用它

12.WORKDIR:工作目录,类似于cd命令

格式:
    WORKDIR /path/to/workdir
示例:
    WORKDIR /a  (这时工作目录为/a)
    WORKDIR b  (这时工作目录为/a/b)
    WORKDIR c  (这时工作目录为/a/b/c)
注:
  通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。

13.USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户

格式:
  USER user
  USER user:group
  USER uid
  USER uid:gid
  USER user:gid
  USER uid:group

 示例:
  USER www

 注:

  使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。

14.ARG:用于指定传递给构建运行时的变量

格式:
    ARG <name>[=<default value>]
示例:
    ARG site
    ARG build_user=www

15.ONBUILD:用于设置镜像触发器

格式:
  ONBUILD [INSTRUCTION]
示例:
  ONBUILD ADD . /app/src
  ONBUILD RUN /usr/local/bin/python-build --dir /app/src
注:
  当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发

例:

# This my first nginx Dockerfile
# Version 1.0

# Base images 基础镜像
FROM centos

#MAINTAINER 维护者信息
MAINTAINER tianfeiyu 

#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH

#ADD  文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/  
ADD epel-release-latest-7.noarch.rpm /usr/local/  

#RUN 执行以下命令 
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www

#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0 

RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install

RUN echo "daemon off;" >> /etc/nginx.conf

#EXPOSE 映射端口
EXPOSE 80

#CMD 运行以下命令
CMD ["nginx"]

dockerfile图解释义

Linux Docker安装 使用 Dockerfile_第1张图片

五、docker-compose

Compose是一个用于定义和运行多容器Docker应用程序的工具。使用组合,可以使用组合文件配置应用程序的服务。然后,使用单个命令从配置中创建和启动所有服务。

yum -y install epel-release ##安装pip
yum -y install python-pip
pip --version ##确认版本
pip install --upgrade pip ##更新pip
pip install docker-compose  ##安装docker-compose
docker-compose version

1.docker-compose.yml 详解

#系统变量
$PWD : 当前目录

#注意:YAML布尔值(true,false,yes,no,on,off)必须用引号括起来,以便解析器将它们解释为字符串。
#字典时
environment:
  SHOW: 'true'
 数组时   
environment:
  - SHOW=true
#版本号
version: "2.1"
# 指定创建的虚拟网络数量 
# 作用:通过不同的虚拟网络实现了容器网络之间的隔离,从而在最大程度上去保护后端网络的安全。
#networks:
#  mynet:
#    driver: bridge
#  mynet1:


# 重用的代码模板
# 模板的定义必须以 x- 开头
x-logging:
	# 以 & 开头的字符串为模板命名
	# 以 * 加上模板的名称引用模板
  &default-logging
  driver: json-file
  options:
    max-size: "200k"
    max-file: "10"
    
# 定义全局挂载卷 
volumes:
  test_1.thinking.com:
  test_2.thinking.com:

# 服务
services: 

 #服务名称
 todo:
	# 构建镜像
     build:
     	 # 指定dockerfile的上下文路径(相对当前docker-compose.yml的位置)
     	 # 包含Dockerfile文件的目录路径,或者是git仓库的URL。 
     	 # 当提供的值是相对路径时,它被解释为相对于当前compose文件的位置。 
     	 # 该目录也是发送到Docker守护程序构建镜像的上下文。
       context: . 
       # Dockerfile的文件名称
       dockerfile: Dockerfile-todo
       args:							
       	# 变量
        buildno: 1
        password: secret
       #  Dockerfile里面可使用的参数变量			
       #  Dockerfile:
       #	ARG buildno 
       #	ARG password
	   #	RUN echo "Build number: $buildno"
	   #	RUN script-requiring-password.sh "$password"
	  
     # 镜像名 : 仓库/标签:版本
     image: zhanyang/todo-demo:1.0.0   
       
     # 依赖(以指定顺序启动)
     depends_on:  
       mysql:
         condition: service_healthy
         
     # 指定一个自定义容器名称,而不是生成的默认名称。
     # 由于Docker容器名称必须是唯一的,因此如果指定了自定义名称,则无法将服务扩展到多个容器。
     container_name: todo
     
     # 卷挂载路径设置。
     # 可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)
     # 挂载数据卷的默认权限是读写(rw),可以通过ro指定为只读。 
     volumes:
			 	# 只需指定一个路径,让引擎创建一个卷
			  - /var/lib/mysql
			 
			  # 指定绝对路径映射
			  - /opt/data:/var/lib/mysql
			 
			  # 相对于当前compose文件的相对路径
			  - ./cache:/tmp/cache
			 
			  # 用户家目录相对路径
			  - ~/configs:/etc/configs/:ro
			 
			  # 命名卷
			  - datavolume:/var/lib/mysql
			  
			  # 使用全局挂载卷
			  - test_1.thinking.com:/test:rw
			  
		 # 指定日志驱动为 json-file,存储日志的最大文件 size 为 200k,最多存储 10 这样大的文件。
		 # logging支持很多driver,而每一个driver对应的options都不一样
		 # docker inspect -f {{.HostConfig.LogConfig}} lnmp-nginx
		 # result:{json-file map[max-file:10 max-size:2000k]}
		 # docker info |grep 'Logging Driver'
		 # result:Logging Driver: json-file
		 # 其他:https://docs.docker.com/engine/admin/logging/overview/
 	logging:
      driver: "json-file"
      options:
        max-size: "200k"
        max-file: "10"
        
		# 指定使用的虚拟网络
    networks: 
    #   - mynet
    
    # 覆盖容器启动后默认执行的命令。 
    # 该命令也可以是一个类似于dockerfile的列表:command: ["bundle", "exec", "thin", "-p", "3000"]
    command: bundle exec thin -p 3000
    # may
    command: ["/usr/local/nginx/sbin/nginx"]
	
		# 链接到另一个服务中的容器。 请指定服务名称和链接别名(SERVICE:ALIAS),或者仅指定服务名称。
		# 实际是通过设置/etc/hosts的域名解析,从而实现容器间的通信。
		# 故可以像在应用中使用localhost一样使用服务的别名链接其他容器的服务,前提是多个服务容器在一个网络中可路由联通
		# links也可以起到和depends_on相似的功能,即定义服务之间的依赖关系,从而确定服务启动的顺序
	links:
	   - db
	   - db:database
	   - redis
	   
	  # 链接到docker-compose.yml 外部的容器,甚至并非 Compose 管理的容器。参数格式跟 links 类似。
	 external
		 - redis_1
		 - project_db_1:mysql
		 - project_db_1:postgresql
		 
		# 暴露端口,但不映射到宿主机,只被连接的服务访问。 仅可以指定内部端口为参数
	 expose:
		 - "3000"
		 - "8000"
		 
		# 暴露端口信息。使用宿主:容器 (HOST:CONTAINER)格式或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
	 ports:
		 - "3000"
		 - "3000-3005"
		 - "8000:8000"
		 - "9090-9091:8080-8081"
		 - "49100:22"
		 - "127.0.0.1:8001:8001"
		 - "127.0.0.1:5000-5010:5000-5010"
		 - "6060:6060/udp"
		# v3.2中ports的长格式的语法允许配置不能用短格式表示的附加字段。
	 ports:
		  - target: 80 #容器内的端口 
		    published: 8080 #物理主机的端口 
		    protocol: tcp #端口协议(tcp或udp) 
		    mode: host #host 和ingress 两总模式,host用于在每个节点上发布主机端口,ingress 用于被负载平衡的swarm模式端口。
		
	# no是默认的重启策略,在任何情况下都不会重启容器。  
	restart: "no"
	# 指定为always时,容器总是重新启动。
	restart: always 
	# 如果退出代码指示出现故障错误,则on-failure将重新启动容器。
	restart: on-failure
	restart: unless-stopped
	
	  
	# pid 将PID模式设置为主机PID模式。
	# 这就打开了容器与主机操作系统之间的共享PID地址空间。 
	# 使用此标志启动的容器将能够访问和操作裸机的命名空间中的其他容器,反之亦然。
	# 即打开该选项的容器可以相互通过进程 ID 来访问和操作。
	pid: "host"
	
	# 配置 DNS 服务器。可以是一个值,也可以是一个列表。
	dns: 8.8.8.8
	dns:
	  - 8.8.8.8
	  - 9.9.9.9
	  
	# 自定义搜索域
	dns_search: example.com
	dns_search:
	  - dc1.example.com
	  - dc2.example.com
	  
	# 覆盖Dockerfile中的entrypoint,用法同Dockerfile中的用法
	entrypoint: ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
	
	# 添加环境变量。 你可以使用数组或字典两种形式。
	# 任何布尔值; true,false,yes,no需要用引号括起来,以确保它们不被YML解析器转换为True或False。 
	environment:
	  RACK_ENV: development
	  SHOW: 'true'
	  SESSION_SECRET:
	# 【注意】:如果你的服务指定了build选项,那么在构建过程中通过environment定义的环境变量将不会起作用。
	# 将使用build的args子选项来定义构建时的环境变量。

	environment:
	  - RACK_ENV=development
	  - SHOW=true
	  - SESSION_SECRE
	  
	# 1>将定义的变量编写在文件中,然后在yml文件中进行添加 
	env_file: .env
	env_file:
	  - ./common.env
	  - ./apps/web.env
	  - /opt/secrets.env
		  
	# 2>例如:
	# old:
		db:
	    image: mysql
	    ports:
	      - "3306:3306"
	    environment:
	      MYSQL_ROOT_PASSWORD: redhat
	      MYSQL_DATABASE: wordpress
	      MYSQL_USER: wordpress
	      MYSQL_PASSWORD: wordpress
	      
    # new:
		db:
		   image: mysql
		   ports:
		      - "3306:3306"
		   env_file: ./mysql_env
    
	  # 创建env_file文件在当前目录mysql_env
		 MYSQL_ROOT_PASSWORD=redhat
		 MYSQL_DATABASE=wordpress
		 MYSQL_USER=wordpress
		 MYSQL_PASSWORD=wordpress3
		
    # 添加hostname映射,类似于docker cli下面的--add-host
	extra_hosts:
     - "www.hcstart.com:192.168.101.14"
 
    # 配置一个检查去测试服务中的容器是否运行正常  
    # 具体: https://docs.docker.com/engine/reference/builder/#healthcheck
    # 查看healthcheck的状态输出 : docker inspect lnmp-nginx
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 1m30s
      timeout: 10s
      retries: 3
	
    #  labels:添加元数据到container中,查看现有容器的labels:
	#  docker inspect -f {{.Config.Labels}} lnmp-nginx # lnmp-nginx :容器名
	labels:
	  com.example.description: "Accounting webapp"
	  com.example.department: "Finance"
	  com.example.label-with-empty-value: ""
	labels:
	  - "com.example.description=Accounting webapp"
	  - "com.example.department=Finance"
	  - "com.example.label-with-empty-value"
	
	# 在容器中设置内核参数
    sysctls:
	     net.core.somaxconn: 1024
	     net.ipv4.tcp_syncookies: 0

	sysctls:
	    - net.core.somaxconn=1024
	    - net.ipv4.tcp_syncookies=0
	    
	    
mysql:
     environment:
       MYSQL_ROOT_PASSWORD: password
       MYSQL_DATABASE: tododb
       MYSQL_USER: user
       MYSQL_PASSWORD: pass
     build:
       context: .
       dockerfile: Dockerfile-mysql
     image: zhanyang/mysql:5.6
     container_name: mysql
     # 以 * 加上模板的名称引用模板     使用全局自定义模板
     logging: *default-logging
 	 # 指定使用的虚拟网络
     networks: 
     #  - mynet1
Compose和Docker兼容性:
    Compose 文件格式有3个版本,分别为1, 2.x 和 3.x
    目前主流的为 3.x 其支持 docker 1.13.0 及其以上的版本

常用参数:
    version           # 指定 compose 文件的版本
    services          # 定义所有的 service 信息, services 下面的第一级别的 key 既是一个 service 的名称

        build                 # 指定包含构建上下文的路径, 或作为一个对象,该对象具有 context 和指定的 dockerfile 文件以及 args 参数值
            context               # context: 指定 Dockerfile 文件所在的路径
            dockerfile            # dockerfile: 指定 context 指定的目录下面的 Dockerfile 的名称(默认为 Dockerfile)
            args                  # args: Dockerfile 在 build 过程中需要的参数 (等同于 docker container build --build-arg 的作用)
            cache_from            # v3.2中新增的参数, 指定缓存的镜像列表 (等同于 docker container build --cache_from 的作用)
            labels                # v3.3中新增的参数, 设置镜像的元数据 (等同于 docker container build --labels 的作用)
            shm_size              # v3.5中新增的参数, 设置容器 /dev/shm 分区的大小 (等同于 docker container build --shm-size 的作用)

        command               # 覆盖容器启动后默认执行的命令, 支持 shell 格式和 [] 格式

        configs               # 不知道怎么用

        cgroup_parent         # 不知道怎么用

        container_name        # 指定容器的名称 (等同于 docker run --name 的作用)

        credential_spec       # 不知道怎么用

        deploy                # v3 版本以上, 指定与部署和运行服务相关的配置, deploy 部分是 docker stack 使用的, docker stack 依赖 docker swarm
            endpoint_mode         # v3.3 版本中新增的功能, 指定服务暴露的方式
                vip                   # Docker 为该服务分配了一个虚拟 IP(VIP), 作为客户端的访问服务的地址
                dnsrr                 # DNS轮询, Docker 为该服务设置 DNS 条目, 使得服务名称的 DNS 查询返回一个 IP 地址列表, 客户端直接访问其中的一个地址
            labels                # 指定服务的标签,这些标签仅在服务上设置
            mode                  # 指定 deploy 的模式
                global                # 每个集群节点都只有一个容器
                replicated            # 用户可以指定集群中容器的数量(默认)
            placement             # 不知道怎么用
            replicas              # deploy 的 mode 为 replicated 时, 指定容器副本的数量
            resources             # 资源限制
                limits                # 设置容器的资源限制
                    cpus: "0.5"           # 设置该容器最多只能使用 50% 的 CPU 
                    memory: 50M           # 设置该容器最多只能使用 50M 的内存空间 
                reservations          # 设置为容器预留的系统资源(随时可用)
                    cpus: "0.2"           # 为该容器保留 20% 的 CPU
                    memory: 20M           # 为该容器保留 20M 的内存空间
            restart_policy        # 定义容器重启策略, 用于代替 restart 参数
                condition             # 定义容器重启策略(接受三个参数)
                    none                  # 不尝试重启
                    on-failure            # 只有当容器内部应用程序出现问题才会重启
                    any                   # 无论如何都会尝试重启(默认)
                delay                 # 尝试重启的间隔时间(默认为 0s)
                max_attempts          # 尝试重启次数(默认一直尝试重启)
                window                # 检查重启是否成功之前的等待时间(即如果容器启动了, 隔多少秒之后去检测容器是否正常, 默认 0s)
            update_config         # 用于配置滚动更新配置
                parallelism           # 一次性更新的容器数量
                delay                 # 更新一组容器之间的间隔时间
                failure_action        # 定义更新失败的策略
                    continue              # 继续更新
                    rollback              # 回滚更新
                    pause                 # 暂停更新(默认)
                monitor               # 每次更新后的持续时间以监视更新是否失败(单位: ns|us|ms|s|m|h) (默认为0)
                max_failure_ratio     # 回滚期间容忍的失败率(默认值为0)
                order                 # v3.4 版本中新增的参数, 回滚期间的操作顺序
                    stop-first            #旧任务在启动新任务之前停止(默认)
                    start-first           #首先启动新任务, 并且正在运行的任务暂时重叠
            rollback_config       # v3.7 版本中新增的参数, 用于定义在 update_config 更新失败的回滚策略
                parallelism           # 一次回滚的容器数, 如果设置为0, 则所有容器同时回滚
                delay                 # 每个组回滚之间的时间间隔(默认为0)
                failure_action        # 定义回滚失败的策略
                    continue              # 继续回滚
                    pause                 # 暂停回滚
                monitor               # 每次回滚任务后的持续时间以监视失败(单位: ns|us|ms|s|m|h) (默认为0)
                max_failure_ratio     # 回滚期间容忍的失败率(默认值0)
                order                 # 回滚期间的操作顺序
                    stop-first            # 旧任务在启动新任务之前停止(默认)
                    start-first           # 首先启动新任务, 并且正在运行的任务暂时重叠

            注意:
                支持 docker-compose up 和 docker-compose run 但不支持 docker stack deploy 的子选项
                security_opt  container_name  devices  tmpfs  stop_signal  links    cgroup_parent
                network_mode  external_links  restart  build  userns_mode  sysctls

        devices               # 指定设备映射列表 (等同于 docker run --device 的作用)

        depends_on            # 定义容器启动顺序 (此选项解决了容器之间的依赖关系, 此选项在 v3 版本中 使用 swarm 部署时将忽略该选项)
            示例:
                docker-compose up 以依赖顺序启动服务,下面例子中 redis 和 db 服务在 web 启动前启动
                默认情况下使用 docker-compose up web 这样的方式启动 web 服务时,也会启动 redis 和 db 两个服务,因为在配置文件中定义了依赖关系

                version: '3'
                services:
                    web:
                        build: .
                        depends_on:
                            - db      
                            - redis  
                    redis:
                        image: redis
                    db:
                        image: postgres                             

        dns                   # 设置 DNS 地址(等同于 docker run --dns 的作用)

        dns_search            # 设置 DNS 搜索域(等同于 docker run --dns-search 的作用)

        tmpfs                 # v2 版本以上, 挂载目录到容器中, 作为容器的临时文件系统(等同于 docker run --tmpfs 的作用, 在使用 swarm 部署时将忽略该选项)

        entrypoint            # 覆盖容器的默认 entrypoint 指令 (等同于 docker run --entrypoint 的作用)

        env_file              # 从指定文件中读取变量设置为容器中的环境变量, 可以是单个值或者一个文件列表, 如果多个文件中的变量重名则后面的变量覆盖前面的变量, environment 的值覆盖 env_file 的值
            文件格式:
                RACK_ENV=development 

        environment           # 设置环境变量, environment 的值可以覆盖 env_file 的值 (等同于 docker run --env 的作用)

        expose                # 暴露端口, 但是不能和宿主机建立映射关系, 类似于 Dockerfile 的 EXPOSE 指令

        external_links        # 连接不在 docker-compose.yml 中定义的容器或者不在 compose 管理的容器(docker run 启动的容器, 在 v3 版本中使用 swarm 部署时将忽略该选项)

        extra_hosts           # 添加 host 记录到容器中的 /etc/hosts 中 (等同于 docker run --add-host 的作用)

        healthcheck           # v2.1 以上版本, 定义容器健康状态检查, 类似于 Dockerfile 的 HEALTHCHECK 指令
            test                  # 检查容器检查状态的命令, 该选项必须是一个字符串或者列表, 第一项必须是 NONE, CMD 或 CMD-SHELL, 如果其是一个字符串则相当于 CMD-SHELL 加该字符串
                NONE                  # 禁用容器的健康状态检测
                CMD                   # test: ["CMD", "curl", "-f", "http://localhost"]
                CMD-SHELL             # test: ["CMD-SHELL", "curl -f http://localhost || exit 1"] 或者 test: curl -f https://localhost || exit 1
            interval: 1m30s       # 每次检查之间的间隔时间
            timeout: 10s          # 运行命令的超时时间
            retries: 3            # 重试次数
            start_period: 40s     # v3.4 以上新增的选项, 定义容器启动时间间隔
            disable: true         # true 或 false, 表示是否禁用健康状态检测和 test: NONE 相同

        image                 # 指定 docker 镜像, 可以是远程仓库镜像、本地镜像

        init                  # v3.7 中新增的参数, true 或 false 表示是否在容器中运行一个 init, 它接收信号并传递给进程

        isolation             # 隔离容器技术, 在 Linux 中仅支持 default 值

        labels                # 使用 Docker 标签将元数据添加到容器, 与 Dockerfile 中的 LABELS 类似

        links                 # 链接到其它服务中的容器, 该选项是 docker 历史遗留的选项, 目前已被用户自定义网络名称空间取代, 最终有可能被废弃 (在使用 swarm 部署时将忽略该选项)

        logging               # 设置容器日志服务
            driver                # 指定日志记录驱动程序, 默认 json-file (等同于 docker run --log-driver 的作用)
            options               # 指定日志的相关参数 (等同于 docker run --log-opt 的作用)
                max-size              # 设置单个日志文件的大小, 当到达这个值后会进行日志滚动操作
                max-file              # 日志文件保留的数量

        network_mode          # 指定网络模式 (等同于 docker run --net 的作用, 在使用 swarm 部署时将忽略该选项)         

        networks              # 将容器加入指定网络 (等同于 docker network connect 的作用), networks 可以位于 compose 文件顶级键和 services 键的二级键
            aliases               # 同一网络上的容器可以使用服务名称或别名连接到其中一个服务的容器
            ipv4_address      # IP V4 格式
            ipv6_address      # IP V6 格式

            示例:
                version: '3.7'
                services: 
                    test: 
                        image: nginx:1.14-alpine
                        container_name: mynginx
                        command: ifconfig
                        networks: 
                            app_net:                                # 调用下面 networks 定义的 app_net 网络
                            ipv4_address: 172.16.238.10
                networks:
                    app_net:
                        driver: bridge
                        ipam:
                            driver: default
                            config:
                                - subnet: 172.16.238.0/24

        pid: 'host'           # 共享宿主机的 进程空间(PID)

        ports                 # 建立宿主机和容器之间的端口映射关系, ports 支持两种语法格式
            SHORT 语法格式示例:
                - "3000"                            # 暴露容器的 3000 端口, 宿主机的端口由 docker 随机映射一个没有被占用的端口
                - "3000-3005"                       # 暴露容器的 3000 到 3005 端口, 宿主机的端口由 docker 随机映射没有被占用的端口
                - "8000:8000"                       # 容器的 8000 端口和宿主机的 8000 端口建立映射关系
                - "9090-9091:8080-8081"
                - "127.0.0.1:8001:8001"             # 指定映射宿主机的指定地址的
                - "127.0.0.1:5000-5010:5000-5010"   
                - "6060:6060/udp"                   # 指定协议

            LONG 语法格式示例:(v3.2 新增的语法格式)
                ports:
                    - target: 80                    # 容器端口
                      published: 8080               # 宿主机端口
                      protocol: tcp                 # 协议类型
                      mode: host                    # host 在每个节点上发布主机端口,  ingress 对于群模式端口进行负载均衡

        secrets               # 不知道怎么用

        security_opt          # 为每个容器覆盖默认的标签 (在使用 swarm 部署时将忽略该选项)

        stop_grace_period     # 指定在发送了 SIGTERM 信号之后, 容器等待多少秒之后退出(默认 10s)

        stop_signal           # 指定停止容器发送的信号 (默认为 SIGTERM 相当于 kill PID; SIGKILL 相当于 kill -9 PID; 在使用 swarm 部署时将忽略该选项)

        sysctls               # 设置容器中的内核参数 (在使用 swarm 部署时将忽略该选项)

        ulimits               # 设置容器的 limit

        userns_mode           # 如果Docker守护程序配置了用户名称空间, 则禁用此服务的用户名称空间 (在使用 swarm 部署时将忽略该选项)

        volumes               # 定义容器和宿主机的卷映射关系, 其和 networks 一样可以位于 services 键的二级键和 compose 顶级键, 如果需要跨服务间使用则在顶级键定义, 在 services 中引用
            SHORT 语法格式示例:
                volumes:
                    - /var/lib/mysql                # 映射容器内的 /var/lib/mysql 到宿主机的一个随机目录中
                    - /opt/data:/var/lib/mysql      # 映射容器内的 /var/lib/mysql 到宿主机的 /opt/data
                    - ./cache:/tmp/cache            # 映射容器内的 /var/lib/mysql 到宿主机 compose 文件所在的位置
                    - ~/configs:/etc/configs/:ro    # 映射容器宿主机的目录到容器中去, 权限只读
                    - datavolume:/var/lib/mysql     # datavolume 为 volumes 顶级键定义的目录, 在此处直接调用

            LONG 语法格式示例:(v3.2 新增的语法格式)
                version: "3.2"
                services:
                    web:
                        image: nginx:alpine
                        ports:
                            - "80:80"
                        volumes:
                            - type: volume                  # mount 的类型, 必须是 bind、volume 或 tmpfs
                                source: mydata              # 宿主机目录
                                target: /data               # 容器目录
                                volume:                     # 配置额外的选项, 其 key 必须和 type 的值相同
                                    nocopy: true                # volume 额外的选项, 在创建卷时禁用从容器复制数据
                            - type: bind                    # volume 模式只指定容器路径即可, 宿主机路径随机生成; bind 需要指定容器和数据机的映射路径
                                source: ./static
                                target: /opt/app/static
                                read_only: true             # 设置文件系统为只读文件系统
                volumes:
                    mydata:                                 # 定义在 volume, 可在所有服务中调用

        restart               # 定义容器重启策略(在使用 swarm 部署时将忽略该选项, 在 swarm 使用 restart_policy 代替 restart)
            no                    # 禁止自动重启容器(默认)
            always                # 无论如何容器都会重启
            on-failure            # 当出现 on-failure 报错时, 容器重新启动

        其他选项:
            domainname, hostname, ipc, mac_address, privileged, read_only, shm_size, stdin_open, tty, user, working_dir
            上面这些选项都只接受单个值和 docker run 的对应参数类似

        对于值为时间的可接受的值:
            2.5s
            10s
            1m30s
            2h32m
            5h34m56s
            时间单位: us, ms, s, m, h
        对于值为大小的可接受的值:
            2b
            1024kb
            2048k
            300m
            1gb
            单位: b, k, m, g 或者 kb, mb, gb
    networks          # 定义 networks 信息
        driver                # 指定网络模式, 大多数情况下, 它 bridge 于单个主机和 overlay Swarm 上
            bridge                # Docker 默认使用 bridge 连接单个主机上的网络
            overlay               # overlay 驱动程序创建一个跨多个节点命名的网络
            host                  # 共享主机网络名称空间(等同于 docker run --net=host)
            none                  # 等同于 docker run --net=none
        driver_opts           # v3.2以上版本, 传递给驱动程序的参数, 这些参数取决于驱动程序
        attachable            # driver 为 overlay 时使用, 如果设置为 true 则除了服务之外,独立容器也可以附加到该网络; 如果独立容器连接到该网络,则它可以与其他 Docker 守护进程连接到的该网络的服务和独立容器进行通信
        ipam                  # 自定义 IPAM 配置. 这是一个具有多个属性的对象, 每个属性都是可选的
            driver                # IPAM 驱动程序, bridge 或者 default
            config                # 配置项
                subnet                # CIDR格式的子网,表示该网络的网段
        external              # 外部网络, 如果设置为 true 则 docker-compose up 不会尝试创建它, 如果它不存在则引发错误
        name                  # v3.5 以上版本, 为此网络设置名称
文件格式示例:
    version: "3"
    services:
      redis:
        image: redis:alpine
        ports:
          - "6379"
        networks:
          - frontend
        deploy:
          replicas: 2
          update_config:
            parallelism: 2
            delay: 10s
          restart_policy:
            condition: on-failure
      db:
        image: postgres:9.4
        volumes:
          - db-data:/var/lib/postgresql/data
        networks:
          - backend
        deploy:
          placement:
            constraints: [node.role == manager]

2.docker-compose 常用命令

# 1.查看docker-compose的版本
docker-compose  --version
# 2.验证(docker-compose.yml)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。
docker-compose config  -q
# 3.启动compose(后台运行,即守护进程)
docker-compose up -d
# 4.指定文件后台启动
docker-compose -f docker-compose.yml  up -d
# 5.查看日志
docker-compose logs tomcat
# 6.监听日志
docker-compose logs -f tomcat
# 7.停止容器
docker-compose stop tomcat
# 8.启动容器
docker-compose start tomcat
# 9.重启容器
docker-compose restart tomcat
# 10.删除容器(推荐先执行停止容器)
docker-compose rm tomcat
# 11.进入tomcat服务下容器
docker-compose exec tomcat bash
# 12.查看当前有哪些容器(docker-compose.yml 所在文件夹下执行)
docker-compose ps
# 13.显示运行的进程:
docker-compose top tomcat
# 14.下载服务镜像
docker-compose pull 镜像名称
# 15.列出镜像
docker-compose images

例:测试所用

version: '3.1' # 版本号
services:   ## 服务
  tomcat:   #tomcat 服务
    restart: always
    image: tomcat:8  #镜像
    container_name: tomcat8  #容器名
    ports:   #端口
      - 8080:8080
    volumes:   #数据卷
      - /home/dabing/lzz/webapps/:/usr/local/tomcat/webapps/

  mysql:  #mysql服务
    build: .  #通过MySQL的Dockerfile文件构建MySQL
    restart: always
    image: mysql:5.7
    container_name: mysql5.7
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    command:
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --max_allowed_packet=128M
      --sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
    volumes:
      - /home/dabing/mysql:/var/lib/mysql

DOCKERFile

#  这个是构建MySQL的dockerfile
 
FROM registry.saas.hand-china.com/tools/mysql:5.7.17
 
# mysql的工作位置
ENV WORK_PATH /usr/local/
 
# 定义会被容器自动执行的目录
ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d
 
#复制gropshop.sql到/usr/local 
COPY grogshop.sql  /usr/local/
#把要执行的shell文件放到/docker-entrypoint-initdb.d/目录下,容器会自动执行这个shell
COPY docker-entrypoint.sh  $AUTO_RUN_DIR/
 
#给执行文件增加可执行权限
RUN chmod a+x $AUTO_RUN_DIR/docker-entrypoint.sh
 
# 设置容器启动时执行的命令
#CMD ["sh", "/docker-entrypoint-initdb.d/import.sh"]

你可能感兴趣的:(linux,docker,linux,运维)