BoyChai's Blog - docker-compose https://blog.boychai.xyz/index.php/tag/docker-compose/ GitLab-代码仓库(部署安装) https://blog.boychai.xyz/index.php/archives/12/ 2022-05-28T11:23:00+00:00 官方文档官方文档系统直接安装的方式系统环境CentOS7,4核CPU和4G内存,selinux和防火墙全部关闭官方推荐最小配置为4核CPU和4G内存,GitLab很吃内存,太低可能部署不起来安装sudo yum install -y curl policycoreutils-python openssh-server perl //安装前置依赖软件 sudo systemctl enable sshd //设置开机自启 sudo systemctl start sshd //开启服务 curl -fsSL https://packages.gitlab.cn/repository/raw/scripts/setup.sh | /bin/bash //配置yum源 sudo EXTERNAL_URL="http://gitlab.host.com" yum install -y gitlab-jh //设置访问地址之后安装GitLab安装好之后会出先一些备注信息,如下图使用Docker的方式系统环境CentOS7,4核CPU和4G内存,selinux和防火墙全部关闭官方推荐最小配置为4核CPU和4G内存,GitLab很吃内存,太低可能部署不起来docker版本为 20.10.16docker-compose版本为 v2.5.0安装系统变量配置在安装之前需要配置一个系统环境,用来存储GitLab安装时、运行时,产生的配置、日志文件。export GITLAB_HOME=/srv/gitlab本地位置容器位置存储内容$GITLAB_HOME/data/var/opt/gitlab用于存储应用程序数据。$GITLAB_HOME/logs/var/log/gitlab用于存储日志。$GITLAB_HOME/config/etc/gitlab用于存储极狐GitLab 配置文件。使用docker安装sudo docker run --detach \ --hostname gitlab.host.com \ --publish 443:443 --publish 80:80 --publish 23:22 \ --name gitlab \ --restart always \ --volume $GITLAB_HOME/config:/etc/gitlab \ --volume $GITLAB_HOME/logs:/var/log/gitlab \ --volume $GITLAB_HOME/data:/var/opt/gitlab \ --shm-size 256m \ registry.gitlab.cn/omnibus/gitlab-jh:latest其中--hostname需要替换成自己的域名。之后使用docker的方式安装下载好镜像启动之后容器会进行初始化,期间是访问不了的可以使用命令“sudo docker logs -f gitlab”来查看进度使用docker-compose安装docker-cmpose的yml文件内容为version: '3.6' services: web: image: 'registry.gitlab.cn/omnibus/gitlab-jh:latest' restart: always hostname: 'gitlab.host.com' environment: GITLAB_OMNIBUS_CONFIG: | external_url 'https://gitlab.example.com' # Add any other gitlab.rb configuration here, each on its own line ports: - '80:80' - '443:443' - '23:22' volumes: - '$GITLAB_HOME/config:/etc/gitlab' - '$GITLAB_HOME/logs:/var/log/gitlab' - '$GITLAB_HOME/data:/var/opt/gitlab' shm_size: '256m'启动命令: "docker-compose up -d"其中hostname需要替换成自己的域名,之后使用docker安装的话下载好镜像启动之后容器会进行初始化,期间是访问不了的,如果想要查看进度需要查看docker-compose运行容器的名称之后使用命令”docker logs -f [容器名称]“来看。安装完成此时访问配置好的域名即可访问,默认账号为root,密码存放在系统或者容器的/etc/gitlab/initial_root_password文件中,cat一下直接使用即可ps:容器密码文件存放在/srv/gitlab/config/initial_root_password文件中,全部的密码文件只会存在24小时,使用这个密码登录只后建议创建一个新的密码 Docker-容器管理 https://blog.boychai.xyz/index.php/archives/9/ 2022-04-06T06:32:00+00:00 Docker概述Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。 下面的图片比较了容器技术和传统的虚拟化技术的对比,可见容器时在操作系统的基础上实现虚拟化,传统的虚拟化技术还需要一层guest OS系统做为基础实现。Docker的安装官方文档:https://docs.docker.com/get-docker/Docker的安装文档清晰明了可以直接去按照他给的步骤一步一步来。卸载旧版本以及残留sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine设置docker的yum软件仓库sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo安装sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin设置docker开机自启并启动sudo systemctl enable --now docker运行一个docker的测试镜像来验证docker的安装[root@docker ~]# sudo docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 2db29710123e: Pull complete Digest: sha256:10d7d58d5ebd2a652f4d93fdd86da8f265f5318c6a73cc5b6a9798ff6d2b2e67 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/ Docker的命令镜像的管理搜索/检索docker search 镜像名称[root@docker ~]# docker search nginx NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 16597 [OK] bitnami/nginx Bitnami nginx Docker Image 121 [OK] ubuntu/nginx Nginx, a high-performance reverse proxy & we… 39 bitnami/nginx-ingress-controller Bitnami Docker Image for NGINX Ingress Contr… 17 [OK] rancher/nginx-ingress-controller 10 ibmcom/nginx-ingress-controller Docker Image for IBM Cloud Private-CE (Commu… 4 bitnami/nginx-ldap-auth-daemon 3 bitnami/nginx-exporter 2 circleci/nginx This image is for internal use 2默认从dockerhub进行搜索镜像下载/拉取docker pull 名称:版本[root@docker ~]# docker pull nginx:1.21.6 1.21.6: Pulling from library/nginx c229119241af: Pull complete 2215908dc0a2: Pull complete 08c3cb2073f1: Pull complete 18f38162c0ce: Pull complete 10e2168f148a: Pull complete c4ffe9532b5f: Pull complete Digest: sha256:2275af0f20d71b293916f1958f8497f987b8d8fd8113df54635f2a5915002bf1 Status: Downloaded newer image for nginx:1.21.6 docker.io/library/nginx:1.21.6如果不加版本的话则拉取latest版本即最新版本镜像列表docker imagesdocker image ls[root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx 1.21.6 12766a6745ee 10 days ago 142MB rancher/mirrored-flannelcni-flannel v0.17.0 9247abf08677 5 weeks ago 59.8MB rancher/mirrored-flannelcni-flannel-cni-plugin v1.0.1 ac40ce625740 2 months ago 8.1MB registry.aliyuncs.com/google_containers/kube-apiserver v1.23.0 e6bf5ddd4098 4 months ago 135MB registry.aliyuncs.com/google_containers/kube-controller-manager v1.23.0 37c6aeb3663b 4 months ago 125MB registry.aliyuncs.com/google_containers/kube-scheduler v1.23.0 56c5af1d00b5 4 months ago 53.5MB registry.aliyuncs.com/google_containers/kube-proxy v1.23.0 e03484a90585 4 months ago 112MB registry.aliyuncs.com/google_containers/etcd 3.5.1-0 25f8c7f3da61 5 months ago 293MB registry.aliyuncs.com/google_containers/coredns v1.8.6 a4ca41631cc7 6 months ago 46.8MB registry.aliyuncs.com/google_containers/pause 3.6 6270bb605e12 7 months ago 683kB五列数据分别代表镜像名称、镜像版本、镜像id、拉取时间、镜像大小镜像标签docker tag [imagesID] 改后名称:改后tag[root@docker ~]# docker tag nginx:1.21.6 mynginx:1.21.6 [root@docker ~]# docker images |grep nginx mynginx 1.21.6 12766a6745ee 10 days ago 142MB nginx 1.21.6 12766a6745ee 10 days ago 142MB 镜像删除docker rmi 镜像id[root@docker ~]# docker rmi mynginx:1.21.6 Untagged: mynginx:1.21.6镜像导出docker save 镜像id/镜像名 > 名字.tar[root@docker ~]# docker save nginx:1.21.6 > nginx-v1.21.6.tar [root@docker ~]# ls nginx-v1.21.6.tar镜像导入docker load < 包名[root@docker ~]# docker rmi nginx:1.21.6 Untagged: nginx:1.21.6 Untagged: nginx@sha256:2275af0f20d71b293916f1958f8497f987b8d8fd8113df54635f2a5915002bf1 Deleted: sha256:12766a6745eea133de9fdcd03ff720fa971fdaf21113d4bc72b417c123b15619 Deleted: sha256:3ea962f6f388096ab9798790d363fc6f9c779c924a5eddf5c699d8da080114f7 Deleted: sha256:091a2aef7242e42505b69f1ad027d6a442cfce2403e260ac914f0fd6cc2d275f Deleted: sha256:4e72a31f1cd6fd655cc0826c91e886967b6e965e13ac21f31f9f66c27a3b7732 Deleted: sha256:e3d1cdf9772a260b3e81a22c1940d63ac45dfe67720f78f00ca73834d9498934 Deleted: sha256:af40da71a8618ea9cbcdc333d5e60bd5b6df820f0d07a55f7c9a1c21fd930095 Deleted: sha256:608f3a074261105f129d707e4d9ad3d41b5baa94887f092b7c2857f7274a2fce [root@docker ~]# docker load < nginx-v1.21.6.tar 608f3a074261: Loading layer [==================================================>] 83.9MB/83.9MB ea207a4854e7: Loading layer [==================================================>] 62MB/62MB 33cf1b723f65: Loading layer [==================================================>] 3.072kB/3.072kB 5c77d760e1f4: Loading layer [==================================================>] 4.096kB/4.096kB fac199a5a1a5: Loading layer [==================================================>] 3.584kB/3.584kB ea4bc0cd4a93: Loading layer [==================================================>] 7.168kB/7.168kB Loaded image: nginx:1.21.6 [root@docker ~]# docker images |grep nginx nginx 1.21.6 12766a6745ee 10 days ago 142MB容器的管理创建容器Docker run [options] image [command] [arg] Option说明: -d 后台运行 -i 以交互模式运行容器,通常与-t同时使用 -t 为容器重新分配一个伪输出终端,通常与-i同时使用 --name 设置容器名字 --net 指定网络连接类型 --h 设置主机名称 --dns 指定容器的dns服务器,默认和宿主一致 -e 设置环境变量(**=”**”) -p 本地端口:容器端口 把容器的某个端口暴露到主机的某个端口 -v 本地目录:容器目录 把主机的某目录挂载到容器的目录里面实现文件系统的链接 --network 指定网络 --rm 容器关闭后自动删除使用命令:"docker run -p 8080:80 -d --name nginx1 nginx"来运行一个nginx容器并且把容器的80端口暴露到本机的8080[root@docker ~]# docker run -p 8080:80 -d --name nginx1 nginx Unable to find image 'nginx:latest' locally latest: Pulling from library/nginx 1fe172e4850f: Pull complete 35c195f487df: Pull complete 213b9b16f495: Pull complete a8172d9e19b9: Pull complete f5eee2cb2150: Pull complete 93e404ba8667: Pull complete Digest: sha256:859ab6768a6f26a79bc42b231664111317d095a4f04e4b6fe79ce37b3d199097 Status: Downloaded newer image for nginx:latest 4cf61416ee672b595b99436d0fdcf8ebe5e6d22adaed8838b29e978f19372ecb容器的创建过程是先到自己本地来找镜像,如果没有则去dockerhub镜像仓库拉取镜像之后再运行容器列表使用命令:"docker ps"来查看已经启动的容器,如果有停止运行的容器可以添加'-a'参数来查看[root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4cf61416ee67 nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx1关闭容器使用命令:"docker stop {容器ID|容器名称}"来关闭容器[root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4cf61416ee67 nginx "/docker-entrypoint.…" 6 minutes ago Exited (0) 4 seconds ago nginx1 58e6c5af6efe hello-world "/hello" 12 hours ago Exited (0) 12 hours ago great_chatterjee启动容器使用命令:"docker start {容器ID|容器名称}"来开启容器[root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4cf61416ee67 nginx "/docker-entrypoint.…" 7 minutes ago Up 6 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx1 重启容器使用命令:"docker restart {容器ID|容器名称}"来重启容器进入容器使用命令:"docker exec -it {容器ID|容器名称} /bin/sh"来进入容器,后面"/bin/sh"是指定进入容器时用的终端,如果容器内有其他的可以自行修改[root@docker ~]# docker exec -it nginx1 /bin/sh # exit [root@docker ~]# docker exec -it nginx1 /bin/bash root@4cf61416ee67:/# ls bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@4cf61416ee67:/# exit exit 容器删除使用命令:"docker rm {容器ID|容器名称}"来删除已经关闭的容器,如果容器在运行中想要强制删除可以加'-f'参数进行强制删除[root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4cf61416ee67 nginx "/docker-entrypoint.…" 15 minutes ago Up 7 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx1 [root@docker ~]# docker rm -f nginx1 nginx1 [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 容器日志使用命令:"docker logs {容器ID|容器名称}"来查看容器运行时的日志[root@docker ~]# docker run -p 8081:80 -d --name myweb nginx 497eff031c03927f17fe14fcff49bea832403687d580294c42f9cfba697a1564 [root@docker ~]# docker logs myweb /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh /docker-entrypoint.sh: Configuration complete; ready for start up 2022/05/02 05:30:57 [notice] 1#1: using the "epoll" event method 2022/05/02 05:30:57 [notice] 1#1: nginx/1.21.6 2022/05/02 05:30:57 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) 2022/05/02 05:30:57 [notice] 1#1: OS: Linux 4.18.0-348.el8.0.2.x86_64 2022/05/02 05:30:57 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576 2022/05/02 05:30:57 [notice] 1#1: start worker processes 2022/05/02 05:30:57 [notice] 1#1: start worker process 32 2022/05/02 05:30:57 [notice] 1#1: start worker process 33 容器转镜像使用命令:"docker commit {容器ID|容器名称} 镜像名称"来打包容器,如果容器在运行中可以使用-p参数[root@docker ~]# docker commit -p myweb myweb:v1.0 sha256:05f5efa5b56fd3d9c6d17b74ee4a3e9866095ac8cc681879dda21b9b7a968859 [root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myweb v1.0 05f5efa5b56f 4 seconds ago 142MB nginx latest fa5269854a5e 11 days ago 142MB hello-world latest feb5d9fea6a5 7 months ago 13.3kB容器信息使用命令"docker inspect {容器ID|容器名称}"来查看容器的详细信息他会列出很多很多信息 我这里举例筛选出容器的IP看一下[root@docker ~]# docker inspect myweb|grep IP "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "IPAMConfig": null, "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, DockerFile概述Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。构建参数COPY复制指令,从上下文目录中复制到容器里面用法:COPY [--chown=用户:组] 源路径 容器目的路径--chown可以不使用ADDADD和COPY使用格式类似 同样需求下官方是推荐使用COPYRUN运行命令用法:RUN 命令CMD类似与Run 与RUN不同的是 CMD是在docker run 的时候执行 而RUN是在dockerfile构建镜像的时候执行用法和RUN一样ENTRYPOINT类似CMD参数,但其不会被docker run的命令参数覆盖用法和RUN、CMD一样(当dockerfile存在多个此参数的时候只会执行最后一个)ENV改变环境变量,定义环境变量。ENV key valueARG和ENV效果一样但是只会在dockerfile构建的时候生效 构建好容器之后不生效VOLUME定义默认挂载数据卷 当运行容器的时候如果没有定义位置会自动挂载VOLUME 路径 路径EXPOSE声明端口 当使用-P运行容器的时候就是映射的这个端口EXPOSE 端口WORKDIR指定工作目录 就是链接的时候的默认目录WORKIDIR 目录USER用来指定执行后续命令的用户USER 用户构建写好Dockerfile文件之后使用命令"docker build 镜像名称:版本 dockerfile的目录"来构建[root@docker ~]# mkdir dockerfile [root@docker ~]# cd dockerfile/ [root@docker dockerfile]# vim dockerfile [root@docker dockerfile]# cat dockerfile FROM nginx RUN echo '我是dockerfile构建的容器' > /usr/share/nginx/html/index.html [root@docker dockerfile]# docker build -t mynginx:v1.0 ./ Sending build context to Docker daemon 2.048kB Step 1/2 : FROM nginx ---> fa5269854a5e Step 2/2 : RUN echo '我是dockerfile构建的容器' > /usr/share/nginx/html/index.html ---> Running in d73c0f94b402 Removing intermediate container d73c0f94b402 ---> 4650cd039883 Successfully built 4650cd039883 Successfully tagged mynginx:v1.0 [root@docker dockerfile]# docker images |grep mynginx mynginx v1.0 4650cd039883 10 seconds ago 142MB Docker的网络概述Docker网络是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络无法直接访问到容器,从而实现网络的隔离。网络模式Host启动容器时使用host模式,那这个容器将不会获得一个独立的ip,而是和宿主机共用一个ip,容器将不会虚拟出自己的网卡,而是使用宿主机的ip和端口,但是容器其他方面,比如文件系统,进程系统都是独立。Container启动容器时使用Container使用的时候需要指定一个容器id或者容器名称,这个模式会和指定的容器共享同一个ip,和host一样除了ip是共享对应容器的ip之外,容器的其他方面,比如文件系统,进程系统都是独立的。None启动容器时使用None,Docker容器将不会生成网卡,也就是说容器会没有网卡,ip,路由等信息。需要我们自己来添加。这种网络情况只会又一个lo回环网卡。bridge当docker服务启动的时候,会在主机上创建一个docker0的虚拟网卡,此主机默认启动的容器都会链接到这个虚拟网卡上。类似与vmwar 的一个虚拟网络。网络管理网络列表使用命令:"docker network ls"来列出所有当前网络[root@docker ~]# docker network ls NETWORK ID NAME DRIVER SCOPE ac3a791d7c38 bridge bridge local cb275e88b131 host host local 68b3fda03c16 none null local创建网络docker network create 参数 网络名称-d:网路模式--subnet:指定网段--gateway:指定网关(指定虚拟网卡得ip)自定网络可以支持很多东西 比如不需要dns可以通过容器名来互相ping同比如我用network create了一个网络 并且创建了两个容器 os1,os2 使用os1pingos2的时候会互通 不需要配置任何的dns 他会自动寻找 默认的docker0则就没有这个功能[root@docker ~]# docker network create -d bridge --subnet 192.168.1.0/24 --gateway 192.168.1.254 mynetwork 5fb087dccbabedf4b97fcc09b448ee717acbfa35fc520698985f536dea8be5e7 [root@docker ~]# docker network ls NETWORK ID NAME DRIVER SCOPE ac3a791d7c38 bridge bridge local cb275e88b131 host host local 5fb087dccbab mynetwork bridge local 68b3fda03c16 none null local删除网络使用命令:"docker rm {网络ID|网络名称}" [root@docker ~]# docker network ls NETWORK ID NAME DRIVER SCOPE ac3a791d7c38 bridge bridge local cb275e88b131 host host local 5fb087dccbab mynetwork bridge local 68b3fda03c16 none null local [root@docker ~]# docker network rm mynetwork mynetwork [root@docker ~]# docker network ls NETWORK ID NAME DRIVER SCOPE ac3a791d7c38 bridge bridge local cb275e88b131 host host local 68b3fda03c16 none null local关联容器docker network connect 命令是用于将docker容器 连接/断开 到某个网络中,或者与其他容器 建联/断开,容器可以使用容器名或者容器ID。用法:docker network connect/disconnect {网络ID|网络名称} {容器ID|容器名称}详细信息使用命令:"docker network inspect {网络ID|网络名称}"来查询网络的详细信息[root@docker ~]# docker network create -d bridge --subnet 192.168.1.0/24 --gateway 192.168.1.254 mynetwork af5233ce4e299130cadee1bc8c9754b576bfb63d6ac229ad7856a653b2109e1e [root@docker ~]# docker network inspect mynetwork [ { "Name": "mynetwork", "Id": "af5233ce4e299130cadee1bc8c9754b576bfb63d6ac229ad7856a653b2109e1e", "Created": "2022-05-02T02:44:46.644429172-04:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.1.0/24", "Gateway": "192.168.1.254" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": {}, "Labels": {} } ] Docker-Compose容器编排概述Docker Compose可以轻松,高效的管理容器,他是一个用于定义和运行多个容器的docker的应用程序工具。在生产环境中一个应用肯定有很多个docker容器构成,而就单纯的docker一次性只能实现单个容器的部署,为了这个问题,docker compose 应运而生。安装官方下载文档:https://docs.docker.com/compose/install/docker默认不自带docker-compose工具,需要自己手动去下载[root@docker ~]# curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 -o /usr/bin/docker-compose % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 664 100 664 0 0 1412 0 --:--:-- --:--:-- --:--:-- 1412 100 25.2M 100 25.2M 0 0 239k 0 0:01:48 0:01:48 --:--:-- 365k [root@docker ~]# chmod +x /usr/bin/docker-compose [root@docker ~]# docker-compose -v Docker Compose version v2.4.1使用和管理使用使用docker-compose需要在目录里定义一个名称为"docker-compose.yml"的yml文件,这个文件就是用来定义服务配置的之后可以使用docker-compose来管理这个文件里定义的资源。官方文档:Docker-Compose启动docker-compose up在当前目录定义好docker-compose的yml文件之后可以使用此命令来运行,默认在前台运行可以追加"-d"参数使其运行在和后台。重新运行docker-compose restart重启全部定义的容器资源停止运行docker-compose stop停止运行定义的容器删除docker-compose down停止并删除对应的容器YML配置参考docker-compose.yml的格式#全局配置层 version: "3" #版本 services: ##定义层 app1: ##配置层 image: nginx:1.26 #镜像 ports:80:80 #端口映射 environment: aa=bb #系统环境 volumes: #挂载卷定义 networks: #网络定义 app2: app3: ... version这个版本需要和docker的版本相对应具体对应信息可去官网查看版本对照build在配置层定义,如果自己定义了dockerfile想让docker-compose来运行可以直接使用build来构建。version: "3" services: myapp: build: .image在配置层定义,用来指定镜像 version: "3"services: myapp: image: nginxcommand在配置层定义,修改容器启动时执行的命令version: "3" services: myapp: image: centos command: ["bash"]container_name在配置层定义,默认docker-compose启动容器的名称格式为<项目名称>_<服务名称>_<序号>,这个参数可以直接修改容器的名字version: "3" services: myapp: container_name: myapp image: centos command: ["bash"]environment在配置层定义,定义容器的环境变量version: "3" services: myapp: container_name: mySQL image: mariadb environment: MYSQL_ROOT_PASSWORD: aaaaaaenv_file在配置层定义,和environment一样用来定义环境变量,他这个是指定一个文件,直接使用environment来定义环境变量可能会有一些敏感信息不适合直接放在docker-compose里使用,env_file可以指定一个环境文件,文件格式为键值对的方式key=valueversion: "3" services: myapp: container_name: mySQL image: mariadb env_file: - ./env [root@boychai docker-compose]# cat env MYSQL_ROOT_PASSWORD=aaaaaaadepends_on在配置层定义,用来配置启动关系,配置了之后里面写其他服务容器的名称,只有里面定义容器启动后,自己才会启动,可以理解为服务容器启动的前提条件。version: "3" services: web: build: . depends_on: - db - redis redis: image: redis db: image: mysqlrestart在配置层定义,用来配置重启策略,模式如下no:是默认的重启策略,在任何情况下都不会重启容器always:容器总是重新启动on-failure:在容器非正常退出时(退出状态非0),才会重启容器unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器version: "3" services: web: restart: always build: . depends_on: - db - redis redis: restart: always image: redis db: restart: always image: mysqlvolumes在配置层定义,用来把主机的数据卷或着文件挂载到容器里。如下version: "3" services: myapp: image: nginx:latest volumes: - "/usr/nginx/html:/usr/share/nginx/html" - "/var/log/nginx:/var/log/nginx"也可以在全局层进行一个生命,然后配置层进行调用,如下version: "3" services: myapp: image: nginx:latest volumes: - nginx_html:/usr/share/nginx/html - nginx_log:/var/log/nginx volumes: - nginx_html: /usr/nginx/html - nginx_log:/var/log/nginxnetworks网络配置,默认不声明的话docker会自动生成一个默认的bridge类型的网络,在全局配置层定义一个networks,如下配置version: "3" services: myapp: image: nginx:latest networks: default: driver: bridge定义默认网络模式为bridge,如果容器不指定则全部使用或者bridge我们还可以自定义一个网络名字,之后在容器的配置层进行绑定这个名词version: "3" services: myapp: image: nginx:latest networks: - mynetwork networks: mynetwork: driver: bridge也可以绑定已存在的网络version: "3" services: myapp: image: nginx:latest networks: - mynetwork networks: mynetwork: external: name: network-test其他关于docker-compose的配置有很多,我这里只是介绍了部分常用的配置,更多具体的配置可以去官网进行查看更多配置实例这里使用docker-compose的方式部署一个WordPress的博客,提供配置参考学习使用。官方教程[root@boychai wp]# cat > docker-compose.yml <<EOF version: '3.1' services: wordpress: image: wordpress restart: always ports: - 8080:80 environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: exampleuser WORDPRESS_DB_PASSWORD: examplepass WORDPRESS_DB_NAME: exampledb volumes: - wordpress:/var/www/html db: image: mysql:5.7 restart: always environment: MYSQL_DATABASE: exampledb MYSQL_USER: exampleuser MYSQL_PASSWORD: examplepass MYSQL_RANDOM_ROOT_PASSWORD: '1' volumes: - db:/var/lib/mysql volumes: wordpress: db: EOF [root@boychai wp]# docker-compose up -d Creating network "wp_default" with the default driver Creating volume "wp_wordpress" with default driver Creating volume "wp_db" with default driver Pulling wordpress (wordpress:)... latest: Pulling from library/wordpress a2abf6c4d29d: Already exists c5608244554d: Already exists 2d07066487a0: Already exists 1b6dfaf1958c: Already exists 32c5e6a60073: Already exists 90cf855b27cc: Already exists 8b0f1068c586: Already exists 5355461305e8: Already exists ad1eec592342: Already exists e03fbc76cb78: Already exists 1f5796e48b39: Already exists 72fbe8e1d4e7: Already exists 96edece66175: Already exists 5f46f0743de2: Pull complete c9f9671a5e1f: Pull complete 3f543dcd35b1: Pull complete c88e21a0c2a0: Pull complete 964b4457a910: Pull complete 0d55fb9a64ef: Pull complete fb009ff7c567: Pull complete 4f058a67a50d: Pull complete Digest: sha256:fc33b796b04162a0db2e9ea9b4c361a07058b21597b1317ad9ab3ea4593de241 Status: Downloaded newer image for wordpress:latest Creating wp_db_1 ... done Creating wp_wordpress_1 ... done [root@boychai wp]#访问服务器地址加8080端口即可出现博客初始化页面,如下图