docker基础

docker基础,第1张

5、 Docker 部署常见服务 5.1 docker搭建MySQL 5.1.1 下载命令
  docker pull mysql:5.7
5.1.2 重命名镜像
  # 重命名镜像
  docker tag docker.io/mysql:5.7 mysql:5.7
  # 删除镜像
  docker rmi docker.io/mysql:5.7

5.1.3 启动MySQL镜像
  # 启动镜像
  docker run -itd --name mysql -p 8206:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
5.1.4 查看镜像启动状态
  docker ps

5.1.5 进入MySQL数据库
   # 进入docker 环境
   docker exec -it mysql /bin/bash
   # 使用数据库客户端
   mysql -u root -h localhost -p123456
5.1.6 配置远程访问 5.1.6.1 开放防火墙
  # 开放防火墙
  firewall-cmd --zone=public --add-port=8206/tcp --permanent
  # 防火墙生效
  firewall-cmd --reload
5.1.6.2 设置账户远程访问
  # 授予账户远程访问权限
  grant all privileges on *.* to root@'%' identified by "123456";
  flush privileges;
5.1.7 远程连接

5.1.8 修改MySQL密码
SET PASSWORD FOR 'root' = PASSWORD('H1997!');
5.2 docker搭建PXC集群 5.2.1 什么是PXC
  # PXC是MySQL的高可用性和扩展性的解决方案,通俗来讲就是MySQL的集群方案
5.2.2 PXC集群的作用
  # 实现数据库的节点实时同步,可以保证数据的一致性,保证数据同步(强一致性)
5.2.3 PXC集群和Replication集群 5.2.3.1 PXC集群的特点

● PXC实现了同步复制,复制数据是双向的,事务在所有的集群节点要么同时提交,要么不提交
● 多主机复制,可以在任何节点上提交数据
● 从( slave)服务器上的并行应用事件,真正的“并行复制”
● 如果设置有自增主键的话,数据不是按照+1的模式进行的,而是按照节点的数量进行递增

5.2.3.2 Replication集群特点

● Replication同步数据是单向的
● Replication在主节点写入, Slave分支读取,master无法读取数据,所以说Replication的每一个节点都不能同时读写

5.2.3.3 PXC集群方案
  # 可以看到PXC的方案是双向的同步数据,任何的一个节点都可以进行读写
  # PXC方案如下图所示:

5.2.3.4 Replication方案
  # 可以看到Replication集群是通过一个Master的主节点进行写入数据,
  # 用户通过Slave节点来读取数据的,数据只能够从Master节点像Slave节点同步
  # 这样异步复制数据就会造成数据的不一致性
  # Replication方案如下图所示:

5.2.4 PXC下载地址
# https://hub.docker.com/r/percona/percona-xtradb-cluster/
5.2.5 安装PXC集群
  # 安装命令 5.7是版本号
  docker pull percona/percona-xtradb-cluster:5.7
  # 查看镜像是否下载成功,结果如下图所示:
  docker images

  # 可以看到pxc的名字很长,于是我们需要对名字进行重命名
  docker tag docker.io/percona/percona-xtradb-cluster pxc
  # 查询重命名的结果,如下图所示:

  # 删除原来的镜像,命令如下: 
  docker rmi docker.io/percona/percona-xtradb-cluster
  # 查询现在的镜像,如下图所示:

  # 创建docker内部网络,网络的名字叫net1,IP地址是172.18.0.1,命令如下:
  docker network create --subnet=172.18.0.1/24 net1
  # 创建结果如下图所示:

  # 查看创建的内部网络net1的信息,命令如下:
  docker inspect net1
  # net1的网络信息如下图所示:

  # 删除net1的网段,命令如下:
  docker network rm net1
  # 删除结果如图所示:

  # 创建docker卷(docker卷可以在宿主机上看的见)
  docker volume create --name V1
  # 查看创建的docker卷
  docker inspect V1
  # docker卷创建信息如下图所示:

5.2.6 PXC 集群的启动
  # 经过上面的步骤我们已经成功的安装了pxc的镜像,docker内部网络net1
  # docker卷V1,现在我们要做的就是启动PXC的容器
  # 创建PXC容器,命令如下:
  # 参数解释:
  # -v是创建的docker卷
  # MYSQL_ROOT_PASSWORD 是MySQL的密码
  # CLUSTER_NAME 集群名称
  # XTRABACKUP_PASSWORD 加入集群的密码
  # privileged是设置权限
  # name=node1 是启动的容器的名字
  # net=net1 是加入的网络的名字
  # ip 是指定的启动的IP
  # pxc:5.7 是启动的镜像
  docker run -d -p 3306:3306 
  -v v1:/var/lib/mysql 
  -e MYSQL_ROOT_PASSWORD=123456 
  -e CLUSTER_NAME=PXC 
  -e XTRABACKUP_PASSWORD=123456 
  --privileged 
  --name=node1 
  --net=net1 
  --ip 172.18.0.2 pxc:5.7

  # 创建启动截图如下所示:

# 创建第二个pxc容器,(如果是MySQL8.0的就会出现SSL错误的情况)
# 出现SSL的情况就需要给docker卷最高权限,命令如下:
# 参考链接:https://juejin.cn/post/6850418107782004750#heading-11
# 创建命令如下:
# 参数解释:
  # CLUSTER_JOIN 表示加入主节点为node1的集群
  docker run -d -p 3307:3306 
  -e MYSQL_ROOT_PASSWORD=123456 
  -e CLUSTER_NAME=PXC 
  -e XTRABACKUP_PASSWORD=123456 
  -e CLUSTER_JOIN=node1 
  -v v2:/var/lib/mysql 
  --privileged
  --name=node2 
  --net=net1 
  --ip 172.18.0.3  pxc:5.7
  # 创建结果如下图所示:

  # 查看docker容器的运行,命令如下:
  docker ps -a
  结果如下图所示:

5.2.7 PXC集群演示
  # 安装完成后可通过本地的客户端工具进行连接,端口和IP都是宿主机的,连接演示如下:


5.2.8 PXC集群搭建的注意点

● 要等到主节点也就是node1能通过主节点连接上在创建第二个节点
● 如果安装的是MySQL8.0就要注意SSL的问题,需要给docker卷足够的权限,不然第二个节点起不来
● 客户端连接的一定是宿主机的IP和端口,宿主机就是你的Linux系统

5.3 docker 搭建Reids 5.3.1 redis镜像下载
  # docker下载redis镜像
  docker pull redis
5.3.2 查看镜像
  # docker 查看镜像
  docker images
5.3.3 镜像重命名
  # docker 镜像重命名
  docker tag docker.io/redis redis
  # 代码截图如下:

5.3.4 删除老的镜像
  # 删除老的镜像
  docker rmi docker.io/redis
  # 删除代码如下图所示:

5.3.5 redis 服务启动
  # 启动命令如下所示:
  docker run -p 6379:6379 -d -it --name redis \
  -v /home/data/redis:/var/lib/redis redis:latest \
  redis-server --appendonly yes
  # 命令解释
  # -p 端口映射,docker的6379端口映射宿主机的6379端口
  # -d 后台启动
  # -v 将docker的/var/lib/redis目录映射到宿主机的/home/data/redis目录
  # redis-server --appendonly yes 在容器执行redis-server启动命令,并打
  # 开redis持久化配置
5.3.6 服务启动验证
  # 查看正在运行的镜像
  docker ps

5.3.7 reids的连接
  # 连接进入redis, redis是名字
  docker exec -it redis
5.3.8 连接redis客户端
  docker exec -it 851c84650721 redis-cli
5.3.9 设置远程访问并设置密码
# 需要上传redis配置文件并且映射到docker容器
  docker run -p 6379:6379 -d -it --name redis -v /etc/redis.conf:/etc/redis.conf -v /home/data/redis:/var/lib/redis      redis:latest redis-server /etc/redis.conf  --appendonly yes --requirepass "H123456"
  # -v /etc/redis.conf:/etc/redis.conf 映射配置文件
  # -v /home/data/redis:/var/lib/redis 映射数据目录
  #  --appendonly yes 数据持久化
  #  --requirepass 设置密码
  # 远程访问需要注释掉 bind 127.0.0.1 -::1 或者 bind 127.0.0.1
  # 还需修改protected-mode yes改为protected-mode no
5.3.10 redis.conf配置文件
  # 下载地址
  # http://download.redis.io/redis-stable/redis.conf
5.3.11 参考地址
  # https://www.cnblogs.com/yqh0128/articles/14592910.html
5.4 docker 搭建 elasticsearch 5.4.1 下载镜像命令
  docker pull elasticsearch:6.5.4
5.4.2 elasticsearch 重新命名
  # 查看docker 镜像
  docker images
  # 重新命名容器
  docker tag docker.io/elasticsearch:6.5.4 elasticsearch:6.5.4
  # 删除容器
  docker rmi docker.io/elasticsearch:6.5.4、
  # 查看容器
  docker images

5.4.3 elasticsearch 配置文件
# 启动配置文件为es-node1.yml
  cluster.name: elasticsearch-cluster
  node.name: es-node1
  network.bind_host: 0.0.0.0
  network.publish_host: 192.168.224.209
  http.port: 9200
  transport.tcp.port: 9300
  http.cors.enabled: true
  http.cors.allow-origin: "*"
  node.master: true 
  node.data: true  
  discovery.zen.ping.unicast.hosts: ["192.168.224.209:9300","192.168.224.209:9301","192.168.224.209:9302"]
  discovery.zen.minimum_master_nodes: 2
# 配置文件es-node2.yml
   cluster.name: elasticsearch-cluster
  node.name: es-node2
  network.bind_host: 0.0.0.0
  network.publish_host: 192.168.224.209
  http.port: 9201
  transport.tcp.port: 9301
  http.cors.enabled: true
  http.cors.allow-origin: "*"
  node.master: true
  node.data: true
  discovery.zen.ping.unicast.hosts: ["192.168.224.209:9300","192.168.224.209:9301","192.168.224.209:9302"]
  discovery.zen.minimum_master_nodes: 2
  # 配置文件es-node3.yml
  cluster.name: elasticsearch-cluster
  node.name: es-node3
  network.bind_host: 0.0.0.0
  network.publish_host: 192.168.224.209
  http.port: 9202
  transport.tcp.port: 9302
  http.cors.enabled: true
  http.cors.allow-origin: "*"
  node.master: true
  node.data: true
  discovery.zen.ping.unicast.hosts: ["192.168.224.209:9300","192.168.224.209:9301","192.168.224.209:9302"]
  discovery.zen.minimum_master_nodes: 2
5.4.4 配置文件说明
  # cluster.name:用于标识一个集群,cluster.name 集群名字相同的所有节点自动
  # 成一个集群。如果不配置改属性,默认值是:elasticsearch。
  # node.name:节点名,默认随机指定一个name列表中名字。集群中node名字不能重复
  # index.number_of_shards: 默认的配置是把索引分为5个分片
  # index.number_of_replicas:设置每个index的默认的冗余备份的分片数,
  # 默认是1
  # network.publish_host:设置其它结点和该结点交互的ip地址,
  # 如果不设置它会自动判断,值必须是个真实的ip地址
  # network.bind_host: 设置可以访问的ip,可以是ipv4或ipv6的,
  # 默认为0.0.0.0,这里全部设置通过
  # http.port:设置对外服务的http端口,默认为9200
  # transport.tcp.port: 设置节点之间交互的tcp端口,默认是9300
  # http.cors.enabled: 是否允许跨域REST请求
  # http.cors.allow-origin: 允许 REST 请求来自何处
  # node.master: true 配置该结点有资格被选举为主结点(候选主结点),
  # 用于处理请求和管理集群。如果结点没有资格成为主结点,那么该结点永远不可能
  # 成为主结点;如果结点有资格成为主结点,只有在被其他候选主结点认可和被选举
  # 为主结点之后,才真正成为主结点。
  # node.data: true 配置该结点是数据结点,用于保存数据,执行数据相关的 *** 作
  #(CRUD,Aggregation)
  # discovery.zen.minimum_master_nodes: //自动发现master节点的最小数,
  # 如果这个集群中配置进来的master节点少于这个数目,es的日志会一直报master
  # 节点数目不足。(默认为1)为了避免脑裂,个数请遵从该公式 => 
  # (totalnumber of master-eligible nodes / 2 + 1)。 * 
  # 脑裂是指在主备切换时,由于切换不彻底或其他原因,
  # 导致客户端和Slave误以为出现两个active master,
  # 最终使得整个集群处于混乱状态*
  # discovery.zen.ping.unicast.hosts:集群个节点IP地址,
  #也可以使用es-node等名称,需要各节点能够解析
5.4.5 启动docker容器
  docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 -v /etc/elasticsearch/config/es-node1.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /home/data/elasticsearch/node1:/usr/share/elasticsearch/data --name es-node1 elasticsearch:6.5.4
  docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9201:9201 -p 9301:9301 -v /etc/elasticsearch/config/es-node2.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /home/data/elasticsearch/node2:/usr/share/elasticsearch/data --name es-node2 elasticsearch:6.5.4
  docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9202:9202 -p 9302:9302 -v /etc/elasticsearch/config/es-node3.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /home/data/elasticsearch/node3:/usr/share/elasticsearch/data --name es-node3 elasticsearch:6.5.4
5.4.6 查看集群状态
  # 访问地址
  http://211.149.224.209:9200/_cat/nodes?pretty

5.4.7 安装elasticsearch-head 可视化es
# 下载镜像
  docker pull mobz/elasticsearch-head:5-alpine
  # 重命名镜像
  docker tag docker.io/mobz/elasticsearch-head:5-alpine mobz/elasticsearch-head:5-alpine
  # 删除老的镜像
  docker rmi docker.io/mobz/elasticsearch-head:5-alpine
  # 启动容器
  docker run -d -p 9100:9100 --name es-manager mobz/elasticsearch-head:5-alpine
  # 访问地址
  http://211.149.224.209:9100/
  # 访问es集群

5.5 docker 搭建 kibana 5.5.1 下载kibana命令
# 安装命令
docker pull kibana:6.5.4
5.5.2 kibana配置文件
server.name: kibana
server.host: "0"
#elasticsearch.hosts: [ "http://192.168.224.209:9200" ]
elasticsearch.url: "http://192.168.224.209:9200" 
xpack.monitoring.ui.container.elasticsearch.enabled: true
5.5.3 启动kibana服务
  # 启动kibana命令
  # docker run -d --name=kibana -p 5601:5601 -e ELASTICSEARCH_URL=http://192.168.224.209:9200 kibana:6.5.4
  docker run -d --name=kibana -p 5601:5601 -v /etc/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:6.5.4
5.5.4 验证服务
  # 查看docker服务2状态
  docker ps

  # 页面访问地址
  http://211.149.224.209:5601/app/kibana#/home?_g=()

5.6 docker 搭建 mongo 5.6.1 mongo镜像下载
  docker pull mongo:latest
5.6.2 镜像重命名
  # 镜像重新命名,重新命名为mongo
  docker tag docker.io/mongo:latest mongo
5.6.3 启动mongo容器
# 启动命令如下:
  docker run -itd -p 27017:27017 --name mongo mongo:latest --auth
  #  --auth 表示需要密码才能够进行访问
  # 启动截图如下:

  # 查看当前运行得容器
  docker ps

5.6.4 连接进入容器
  docker exec -it mongo mongo admin

5.6.5 创建用户
  # 创建一个名为admin 密码为123456的用户
  db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});

  # 尝试使用上面创建的用户信息进行连接
  db.auth('admin','123456')

5.7 docker 开启远程访问 5.7.1 方式一
  # 这是网上给的配置方法,也是这种简单配置让Docker Daemon把服务
  # 暴露在tcp的2375端口上,这样就可以在网络上 *** 作Docker了。
  # Docker本身没有身份认证的功能,只要网络上能访问到服务端口,
  # 就可以 *** 作Docker。
  vim /etc/default/docker
  # 在文件中加入下面一句
  DOCKER_OPTS="-H tcp://0.0.0.0:2375"
  # 重启docker
  systemctl restart docker
5.7.2 方式二
  # 修改docker服务配置参数
  vim /usr/lib/systemd/system/docker.service
  # 修改如下:
  ExecStart= ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
  # 重启服务
  systemctl daemon-reload
  systemctl restart docker
5.7.3 方式三 下面修改daemon.json的配置
  vim /etc/docker/daemon.json
  # 修改配置文件
  {
    "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
  }
  # 修改配置
  systemctl daemon-reload
  systemctl restart docker
5.7.4 测试是否配置成功
  # 输入命令
  docker -H tcp://192.168.91.128:2375 version
  # 结果如下:

5.8 docker 部署 maven项目 5.8.1 本地工程启动正常
  # 本次用来演示的是一个eureka注册中心,首先保证本地启动成功才能部署docker
  # 访问地址 127.0.0.1:8220 如下图所示

5.8.2 pom文件修改
# 加入docker 部署插件

    
        
            src/main/resources
            
            true
        
    
    
        
            org.apache.maven.plugins
            maven-compiler-plugin
            3.8.1
            
                1.8
                1.8
                UTF-8
                true
                
                D:\Program Files\Java\jdk1.8.0_201\bin\javac
            
        
        
            org.springframework.boot
            spring-boot-maven-plugin
            2.3.7.RELEASE
            
                com.dream.EurekaRegisterCenterApplication
            
            
                
                    repackage
                    
                        repackage
                    
                
            
        
        
        
            com.spotify
            docker-maven-plugin
            1.0.0
            
                
                http://192.168.91.128:2375
                
                ${docker.image.prefix}/${project.artifactId}
                
                src/main/docker
                
                    
                        /
                        
                        ${project.build.directory}
                        
                        ${project.build.finalName}.jar
                    
                
            
        
    
    eureka-register-center



    1.8
    UTF-8
    UTF-8
    dream

  # 对于以上配置的说明
  # 这是为了解决IDEA一直找不到JDK的问题
  D:\Program Files\Java\jdk1.8.0_201\bin\javac
  # 这是dockerFile文件的位置
  src/main/docker
  # 表示最后打成jar的名称,这个地方在dockerFile的时候会有影响
  eureka-register-center
  # Dokcerfile 文件内容
  FROM java:8
  # VOLUME 指定了临时文件目录为/tmp。
  # 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
  VOLUME /tmp
  # 将jar包添加到容器中并更名eureka-register-center.jar
  ADD eureka-register-center.jar eureka-register-center.jar
  # 运行jar包
  RUN bash -c 'touch /eureka-register-center.jar'
  ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom-","-jar","/eureka-register-center.jar"]
  # Dockerfile 文件说明注意点
  # 将jar包添加到容器中并更名为eureka-register-center.jar
  # ADD eureka-register-center.jar eureka-register-center.jar
  # 这里如果有了这个同时pom文件中写了eureka-register-center
  # 这时候pom文件中的0.0.1-SNAPSHOT就没有作用了
  # 如果你写的是ADD eureka-register-center-0.0.1-SNAPSHOT.jar eureka-register-center.jar
  # 就会出现异常
5.8.3 执行一键部署
  # 在Dockerfile文件编写好之后,需要将镜像给推到docker服务上面
  # 执行命令 mvn clean package docker:build -Dmaven.test.skip=true

  # 此时我们来看服务器上的docker镜像
  # docker images

5.8.4 启动容器
  # 启动命令
  docker run -p 8220:8220 dream/eureka-register-center:latest
  # 命令说明 第一个8220是宿主机的端口,第二个8220是容器的端口
5.8.5 访问eureka地址
  # http://192.168.91.128:8220/
  # 结果如下图所示:

6、 Dockerfile 文件 6.1 Dockerfile 简介

Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

6.2 Dockerfile 基本语法
  FROM 指令:FROM指定基础镜像
  所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。
  就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。
  而 FROM 就是指定 基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。

  RUN指令:RUN指令是用来执行命令行命令的。RUN 指令在定制镜像时是最常用的指令之一。其格式有两种:shell格式和exec格式
  shell格式RUN指令如下:
  RUN echo 'Hello, Docker!' > /usr/share/nginx/html/index.html
  exec格式RUN指令如下:
  FROM debian:stretch
  RUN apt-get update
  RUN apt-get install -y gcc libc6-dev make wget
  RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
  RUN mkdir -p /usr/src/redis
  RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1
  RUN make -C /usr/src/redis
  RUN make -C /usr/src/redis install
6.3 Dockerfile 构建镜像
# 在Dockerfile 文件目录执行,实例:
$ docker build -t nginx:v3 .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM nginx
 ---> e43d811ce2f4
Step 2 : RUN echo 'Hello, Docker!' > /usr/share/nginx/html/index.html
 ---> Running in 9cdc27646c7b
 ---> 44aa4490ce2c
Removing intermediate container 9cdc27646c7b
Successfully built 44aa4490ce2c
# 以上示例中我们使用了 docker build 命令对镜像进行构建

6.4 Dockerfile 构建镜像地注意点

构建Dockerfile镜像的时候会看到上面docker build 最后面有个点。 . 表示当前目录,但是这个当前目录不是指的 *** 作者现在所在的这个当前目录,而是指的是上下文的这目录。那么什么是上下文。下面看一下官方给的上下文例子。

如果在 Dockerfile 中这么写:
COPY ./package.json /app/
这并不是要复制执行 docker build 命令所在的目录下的 package.json,也不是复制 Dockerfile 所在目录下的 package.json,而是复制 上下文(context) 目录下的 package.json。
因此,COPY 这类指令中的源文件的路径都是相对路径。这也是初学者经常会问的为什么 COPY …/package.json /app 或者 COPY /opt/xxxx /app 无法工作的原因,因为这些路径已经超出了上下文的范围,Docker 引擎无法获得这些位置的文件。如果真的需要那些文件,应该将它们复制到上下文目录中去。
现在就可以理解刚才的命令 docker build -t nginx:v3 . 中的这个 .,实际上是在指定上下文的目录,docker build 命令会将该目录下的内容打包交给 Docker 引擎以帮助构建镜像。
如果观察 docker build 输出,我们其实已经看到了这个发送上下文的过程:
$ docker build -t nginx:v3 .
Sending build context to Docker daemon 2.048 kB

6.5 docker build 的其他用法
  # 直接用git仓库进行构建 (可以看出docker build 支持从URL构建)
  docker build -t hello-world https://github.com/docker-library/hello-world.git#master:amd64/hello-world

# 用给定的压缩包构建
docker build http://server/context.tar.gz
如果所给出的 URL 不是个 Git repo,而是个 tar 压缩包,那么 Docker 引擎会下载这个包,并自动解压缩,以其作为上下文,开始构建。
6.6 Dockerfile 指令详解
# COPY 指令 (复制文件)
# COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
COPY package.json /usr/src/app/
# ADD 指令 更高级的复制文件(如果不需要解压文件就可以使用ADD指令)
# ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz 
# CMD 容器启动命令
CMD 指令的格式和 RUN 相似,也是两种格式:shell格式和exec格式。
Docker 不是虚拟机,容器就是进程。既然是进程,那么在启动容器的时候,需要指定所运行的程序及参数。CMD 指令就是用于指定默认的容器主进程的启动命令的。
shell 格式:CMD <命令>
exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
参数列表格式:CMD ["参数1", "参数2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数
7、 docker-compose 基础 7.1 docker-compose 安装(centos7)
  # 访问 https://docs.docker.com/compose/install/
  # 下载命令
 sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 
  # 对二进制文件应用可执行权限
  sudo chmod +x /usr/local/bin/docker-compose 
  # 注意:如果docker-compose安装后命令失败,请检查您的路径。您还可以/usr/bin在路径中创建指向或任何其他目录的符号链接。
 sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose 
  # 完成安装,查看版本
 docker-compose --version
7.2 docker-compose 几个术语
服务 (service) 一个应用容器,实际上可以运行多个相同镜像的实例。
项目 (project) 由一组关联的应用容器组成的一个完整业务单元。
可见,一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理。
7.3 docker-compose 几个常见指令
# 服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db。可以随时在项目目录下运行 docker-compose build 来重新构建服务
docker-compose build

# 验证 Compose 文件格式是否正确,若正确则显示配置,若格式错误显示错误原因。
docker-compose config

# down此命令将会停止 up 命令所启动的容器,并移除网络
docker-compose up

# 进入指定的容器
docker-compose exec

# 获得一个命令的帮助。
docker-compose help

# 列出 Compose 文件中包含的镜像。
docker-compose images

# 停止服务容器
docker-compose kill -s SIGINT

# 查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color 来关闭颜色。
docker-compose logs [options] [SERVICE...]

# 暂停一个服务容器。
docker-compose pause [SERVICE...]

# 打印某个容器端口所映射的公共端口。
docker-compose port [options] SERVICE PRIVATE_PORT
选项:
--protocol=proto 指定端口协议,tcp(默认值)或者 udp。
--index=index 如果同一服务存在多个容器,指定命令对象容器的序号(默认为 1)。

# 列出项目中目前的所有容器。
docker-compose ps

# 拉取镜像依赖
docker-compose pull 服务名称

# 推送服务依赖的镜像到 Docker 镜像仓库。
docker-compose push 服务名称

# 重启项目中的服务。
docker-compose restart 服务名称

# 删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。
docker-compose rm 服务名称
7.4 docker-compse 的模板文件
# 容器名称 指定容器名称。默认将会使用 项目名称_服务名称_序号 这样的格式。
container_name

# depends_on 解决容器的依赖、启动先后的问题。以下例子中会先启动 redis db 再启动 web
version: '3'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres
# 注意:web 服务不会等待 redis db 「完全启动」之后才启动。
# dns 自定义 DNS 服务器。可以是一个值,也可以是一个列表。
dns:
  - 8.8.8.8
  - 114.114.114.114
# env_file 从文件中获取环境变量,可以为单独的文件路径或列表。
如果通过 docker-compose -f FILE 方式来指定 Compose 模板文件,则 env_file 中变量的路径会基于模板文件路径。
如果有变量名称与 environment 指令冲突,则按照惯例,以后者为准。
env_file:
  - ./common.env
  - ./apps/web.env
# environment 设置环境变量。你可以使用数组或字典两种格式。
只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据。
environment:
  - RACK_ENV=development
  - SESSION_SECRET

# expose 暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定内部端口为参数
expose:
 - "3000"
 - "8000"
# image 镜像名称 指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
image: ubuntu
image: orchardup/postgresql

# logging 配置日志选项
logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"
# 目前支持三种日志类型
driver: "json-file"
driver: "syslog"
driver: "none"
# 配置日志相关参数
options:
  max-size: "200k"
  max-file: "10"
# network_mode 设置网络模式
network_mode: "bridge"
network_mode: "host"
network_mode: "none"

# networks 配置容器连接的网络
version: "3"
services:
  some-service:
    networks:
     - some-network
     - other-network
networks:
  some-network:
  other-network:
# 暴露端口信息 使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"
 
 注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。
# sysctls 配置系统内核参数
sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0
sysctls:
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=0
# ulimits 指定容器的 ulimits 限制值。
例如,指定最大进程数为 65535,指定文件句柄数为 20000(软限制,应用可以随时修改,不能超过硬限制) 和 40000(系统硬限制,只能 root 用户提高)。
  ulimits:
    nproc: 65535
    nofile:
      soft: 20000
      hard: 40000
# volumes 数据卷所挂载路径设置。可以设置为宿主机路径(HOST:CONTAINER)或者数据卷名称(VOLUME:CONTAINER),并且可以设置访问模式 (HOST:CONTAINER:ro)。
version: "3"
services:
  my_src:
    image: mysql:8.0
    volumes:
      - mysql_data:/var/lib/mysql
volumes:
  mysql_data:  
# restart 指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always或者 unless-stopped。
restart: always
# privileged 允许容器中运行一些特权命令。
privileged: true

8、 docker-compose 部署常见服务 8.1 docker-compose 搭建 MySQL
version: '3'
services:
  mysql:
    image: mysql:5.7
    restart: always
    container_name: mysql
    volumes:
      - /home/data/mysql:/var/lib/mysql
      - /home/logs/mysql:/var/log/mysql
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=Hjc19970616
    privileged: true
networks:
  default:
    external:
      name: mysql_default
8.2 docker-compose 搭建Redis
version: '3'
services:
  redis:
    image: redis:latest
    restart: always
    container_name: redis
    ports:
      - 8210:6379
    volumes:
      - /etc/redis.conf:/etc/redis.conf
      - /home/data/redis:/var/lib/redis
    command: redis-server /etc/redis.conf --appendonly yes --requirepass "Hjc19970616"
    privileged: true
networks:
  default:
    external:
      name: bin_default
8.3 docker-compose 搭建mongo
version: '3'
services:
  mongodb:
    image: mongo:5.0
    container_name: mongodb
    volumes:
      # ./data/db 数据库文件存放地址,根据需要修改为本地地址
      - /home/data/mongodb:/home/data/mongodb
    ports:
      - 27017:27017
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: Hjc19970616
    privileged: true
networks:
  default:
    external:
      name: mysql_default
8.4 docker-compose 搭建single-es
version: '3'
services:
  elasticsearch:
    image: elasticsearch:6.8.17
    container_name: elasticsearch
    privileged: true
    environment:
      - xpack.security.enabled=false
      - discovery.type=single-node
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    cap_add:
      - IPC_LOCK
    volumes:
      - /home/data/elasticsearch/single:/home/data/elasticsearch/single
      - /home/logs/elasticsearch/single:/home/logs/elasticsearch/single
    ports:
    - 9200:9200
    - 9300:9300
  kibana:
    image: kibana:6.8.17
    container_name: kibana
    environment:
      - SERVER_NAME=kibana
      - ELASTICSEARCH_URL=http://elasticsearch:9200
      - XPACK_MONITORING_ENABLED=true
    ports:
      - 5601:5601
    depends_on:
      - elasticsearch
networks:
  default:
    external:
      name: mysql_default
8.5 docker-compose 搭建zookeeper
version: '3'
services:
  zoo1:
    image: zookeeper
    restart: always
    container_name: zoo1
    hostname: zoo1
    ports:
      - 2181:2181
    volumes:
      - "/home/data/zookeeper/zoo1:/home/data/zookeeper/zoo1"
      - "/home/logs/zookeeper/zoo1:/home/logs/zookeeper/zoo1"
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181
    privileged: true
  zoo2:
    image: zookeeper
    restart: always
    container_name: zoo2
    hostname: zoo2
    ports:
      - 2182:2181
    volumes:
      - "/home/data/zookeeper/zoo2:/home/data/zookeeper/zoo2"
      - "/home/logs/zookeeper/zoo2:/home/logs/zookeeper/zoo2"
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181
    privileged: true
networks:
  default:
    external:
      name: zookeeper_default
8.6 docker-compose 搭建kafka
version: '3'
services:
  kafka1:
    image: wurstmeister/kafka
    restart: unless-stopped
    container_name: kafka1
    hostname: kafka1
    ports:
      - "9092:9092"
    external_links:
      - zoo1
      - zoo2
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.3.84:9092    # 宿主机IP
      KAFKA_ADVERTISED_HOST_NAME: kafka1
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181,zoo2:2181"
    volumes:
      - "/home/data/kafka/kafka1:/home/data/kafka/kafka1"
    privileged: true
  kafka2:
    image: wurstmeister/kafka
    restart: unless-stopped
    container_name: kafka2
    hostname: kafka2
    ports:
      - "9093:9092"
    external_links:
      - zoo1
      - zoo2
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.3.84:9093    # 宿主机IP
      KAFKA_ADVERTISED_HOST_NAME: kafka2
      KAFKA_ADVERTISED_PORT: 9093
      KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181,zoo2:2181"
    volumes:
      - "/home/data/kafka/kafka2:/home/data/kafka/kafka2"
    privileged: true
  kafka-manager: # Kafka 图形管理界面
    image: sheepkiller/kafka-manager:latest
    restart: unless-stopped
    container_name: kafka-manager
    hostname: kafka-manager
    ports:
      - "9000:9000"
    links:  # 连接本compose文件创建的container
      - kafka1
      - kafka2
    external_links: # 连接外部compose文件创建的container
      - zoo1
      - zoo2
    environment:
      ZK_HOSTS: zoo1:2181,zoo2:2181
      KAFKA_BROKERS: kafka1:9092,kafka2:9093
networks:
  default:
    external:
      name: zookeeper_default
8.7 docker-compose 搭建nps
version: '3'
services:
  nps:
    image: ffdfgdfg/nps
    container_name: nps
    restart: always
    network_mode: "host"
    volumes:
      - /etc/nps:/conf
    privileged: true
networks:
  default:
    external:
      name: bin_default
8.8 docker-compose 搭建npc
version: '3'
services:
  npc:
    image: ffdfgdfg/npc
    restart: always
    container_name: npc
    network_mode: "host"
    command:
      - -server
      - req.alone-dream.cn:8224
      - -vkey
      - Hjc199706
    privileged: true
networks:
  default:
    external:
      name: mysql_default
8.9 docker-compose 搭建Nacos
version: '3'
services:
  nacos:
    image: nacos/nacos-server:latest
    restart: always
    container_name: nacos
    environment:
      # 如果支持主机名可以使用hostname,否则使用ip,默认也是ip
      PREFER_HOST_MODE: hostname
      # 数据源平台 仅支持mysql或不保存empty
      SPRING_DATASOURCE_PLATFORM: mysql
      MODE: standalone
      MYSQL_SERVICE_HOST: mysql
      MYSQL_SERVICE_DB_NAME: nacos_config
      MYSQL_SERVICE_PORT: 3306
      MYSQL_SERVICE_USER: root
      MYSQL_SERVICE_PASSWORD: Hjc19970616
      # NACOS_APPLICATION_PORT: 9999
      JVM_XMS: 256m
      JVM_MMS: 128m
    # 设置挂载目录
    volumes:
      - /home/logs/nacos:/home/logs/nacos
    ports:
      - 8248:8848
    privileged: true
networks:
  default:
    external:
      name: bin_default
8.10 docker-compose 搭建portainer
version: '3'
services:
  portainer:
    image: portainer/portainer:1.24.1
    container_name: portainer-manage
    command: -H unix:///var/run/docker.sock
    restart: always
    ports:
    - 8205:9000
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    - /portainer_data:/data
    privileged: true
8.11 docker-compose 搭建DOClever
version: '3'
services:
  DOClever:
    image: lw96/doclever
    restart: always
    container_name: "DOClever"
    ports:
      - 8247:10000
    volumes:
      - /home/data/DOClever/file:/home/DOClever/data/file
      - /home/data/DOClever/img:/home/data/DOClever/img
      - /home/data/DOClever/tmp:/home/data/DOClever/tmp
    environment:
      - DB_HOST=mongodb://mongodb:27017/DOClever
    #      - MONGO_INITDB_ROOT_USERNAME=root
    #      - MONGO_INITDB_ROOT_PASSWORD=Hjc19970616
    privileged: true
networks:
  default:
    external:
      name: bin_default

欢迎关注我的微信公众号,更多内容将在微信公众号中发布:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/926307.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存