GVKun编程网logo

使用docker compose制作一套简单的CI服务(如何制作docker)

16

对于想了解使用dockercompose制作一套简单的CI服务的读者,本文将是一篇不可错过的文章,我们将详细介绍如何制作docker,并且为您提供关于c#–使用docker-compose运行dock

对于想了解使用docker compose制作一套简单的CI服务的读者,本文将是一篇不可错过的文章,我们将详细介绍如何制作docker,并且为您提供关于c# – 使用docker-compose运行docker镜像、CentOS7中使用docker-compose部署服务、docker 及 docker-compose 的快速安装和简单使用、Dockerfile格式、Dockerfile示例、用docker compose部署服务、docker compose示例的有价值信息。

本文目录一览:

使用docker compose制作一套简单的CI服务(如何制作docker)

使用docker compose制作一套简单的CI服务(如何制作docker)

没有什么步骤了,就只有docker-compose.yml文件,其余的交给docker环境自动生成了。

文件内容如下:

version: ''2''

networks:
  prodnetwork:
    driver: bridge

services:
 nexus:
  image: sonatype/nexus3
  ports:
    - 8081:8081
  networks:
    - prodnetwork

 jenkins:
  image: jenkins
  ports:
    - 8080:8080
  networks:
    - prodnetwork
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
    - /usr/local/bin/docker:/usr/bin/docker
    - /opt/jenkins/:/var/lib/jenkins/
  links:
    - nexus
    - gitlab
    - sonar
  environment:
    - NEXUS_PORT=8081
    - SONAR_PORT=9000
    - SONAR_DB_PORT=5432

 sonar:
  image: sonarqube
  ports:
   - 9000:9000
  networks:
    - prodnetwork
  links:
    - sonardb
  environment:
   - SONARQUBE_JDBC_URL=jdbc:postgresql://sonardb:5432/sonar
   - SONARQUBE_JDBC_USERNAME=sonar
   - SONARQUBE_JDBC_PASSWORD=sonar
 sonardb:
  networks:
    - prodnetwork
  image: postgres
  ports: 
   - 5432:5432
  environment:
   - POSTGRES_DB=sonar
   - POSTGRES_USER=sonar
   - POSTGRES_PASSWORD=sonar
  volumes:
    - /opt/postgres/data:/var/lib/postgresql/data

 gitlab:
  image: gitlab/gitlab-ce
  restart: always
  networks:
    - prodnetwork
  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
    - 2222:22
  volumes:
    - /opt/gitlab/config:/etc/gitlab
    - /opt/gitlab/logs:/var/log/gitlab
    - /opt/gitlab/data:/var/opt/gitlab

测试过,服务都可以起来。

c# – 使用docker-compose运行docker镜像

c# – 使用docker-compose运行docker镜像

我在C#中使用我的简单应用程序与postgresql连接.
我想用这个应用程序创建图像,然后用docker运行.

我使用时一切正常:

$docker build
$docker run postgres
$docker run my_app

另外,当我从应用程序目录使用compose时,一切都还可以:

$docker-compose build
$docker-compose up

但有没有机会使用docker-compose为我之前建立的图像?

我想将此图像发布到我的仓库,我的团队中的其他人只需下载并运行此图像(应用程序数据库).

当我进行compose-build和next compose运行my_app时,我在连接数据库时遇到异常:

dbug: Npgsql.NpgsqlConnection[3]
      opening connection to database 'POSTGRES_USER' on server 'tcp://postgres:5432'.

Unhandled Exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.AggregateException: One or more errors occurred. (No such device or address) ---> System.Net.Internals.socketExceptionFactory+ExtendedSocketException: No such device or address

我当前的docker-compose.yml文件:

version: '2'

services:

  web:
    container_name: 'postgrescoreapp'
    image: 'postgrescoreapp'
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - .:/var/www/postgrescoreapp
    ports:
     - "5001:5001"
    depends_on:
     - "postgres"
    networks:
      - postgrescoreapp-network

  postgres:
    container_name: 'postgres'
    image: postgres
    environment:
      POSTGRES_PASSWORD: password
    networks:
      - postgrescoreapp-network

networks:
  postgrescoreapp-network:
    driver: bridge

解决方法:

您应该使用以下名称构建映像:(registryName:RegistryPort)/ imagename:version

$docker build -t myRegistry.example.com:5000/myApp:latest .
$docker build -t myRegistry.example.com:5000/myDb:latest .

现在将这些行添加到docker-compose文件中:

Myapp:                                                    
  image: myRegistry.example.com:5000/myApp:latest 

MyDb:                        
  image: myRegistry.example.com:5000/myDb:latest

然后推它:

$docker push myRegistry.example.com:5000/myApp:latest
$docker push myRegistry.example.com:5000/myDb:latest

你的伙伴现在应该能够拉它

$docker pull myRegistry.example.com:5000/myApp:latest
$docker pull myRegistry.example.com:5000/myDb:latest

CentOS7中使用docker-compose部署服务

CentOS7中使用docker-compose部署服务

点击上方蓝色字"码之初"关注,右上角选择"设为星标"

开始Java基础、架构设计、源码阅读

关注=进步,可能还会加薪哦!


之前讲解过Docker安装单个服务的系列教程,没看过的可以点击下面的链接回顾一下:

  • Docker学习笔记一:Docker简介与安装

  • MacOS安装Docker傻瓜式教程

  • mac系统下docker安装配置mysql详细步骤

  • mac系统Docker安装Redis教程

  • mac系统Docker安装Nginx教程



Docker的用途我在这里就不做赘述了,不懂的自己戳上面的链接学习,假如现在我们有个Springboot应用,里面用到了mysql、Redis、Nginx等服务,那现在我们要用Docker部署我们的服务,通常需要下面几步:

  • 安装docker

  • 使用docker安装Redis

  • 使用docker安装Mysql

  • 使用docker安装、配置Nginx

  • springboot应用打成Jar包和编写dockerfile


安装好以上服务之后,我们还要一一启动,然后再运行项目才能访问,虽然说docker有一次打包到处运行、节省存储空间和资源,应用隔离和服务器整合等优点,但是仔细看上面的部署步骤,即便我们用了docker,也还是要在docker里手动安装其他服务,现在只有redis、mysql、nginx几个服务,如果我们以后还要加ES、Mongo等等越来越多的服务,好像并没有提高很多效率,那作为“万能”的程序员,有解决方法吗?那必须有啊,下面就进入本文的重点:docker-compose。



docker-compose简介


Compose是用于定义和运行多容器Docker应用程序的工具,是docker的服务编排工具,主要应用于构建基于Docker的复杂应用,compose通过一个配置文件来管理多个docker容器,适合组合使用多个容器进行开发的场景。
使用compose,可以使用yml或者yaml文件配置应用程序的服务。 然后,通过一个命令,可以从配置中创建和启动所有服务。更多资料可以参考官网:https://docs.docker.com/compose/overview/

docker-compose安装


安装docker相关依赖环境:
# 安装依赖sudo yum install -y yum-utils device-mapper-persistent-data lvm2# 添加docker下载仓库sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 安装docker-cesudo yum install docker-ce# 启动docker-cesudo systemctl start docker# 验证sudo docker --version

compose官网安装文档 https://docs.docker.com/compose/install/#install-compose
1、安装Run this command to download the latest version of Docker Composesudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
2、赋权Apply executable permissions to the binary:sudo chmod +x /usr/local/bin/docker-compose
3、Optionally, install command completion for the bash and zsh shell.
4、测试(查看版本)Test the installationdocker-compose --version


docker-compose部署服务详解

使用compose部署应用一般需要下面几个步骤:
  1. 用dockerfile,或者镜像定义应用程序所依赖的环境,以便在任何地方都可以直接复制。

  2. 在docker-compose.yaml中定义应用程序需要的服务,以便这些服务可以在单独的环境中一起运行。

  3. 运行docker-compose build 安装应用程序所需要的服务镜像。

  4. 运行docker-compose up -d 启动并在后台运行整个应用程序。

  5. 运行docker compose down 停止整个应用程序。


下面我们来详细讲解上面的四个步骤。


docker-compose部署Spring Boot+Nginx+Redis+Mysql实战

历经了一个月,终于将个人的博客发布上线了,原来准备用传统的方式先草草上线,可是对于一个对前沿技术有强迫症的开发者来说,哪怕不精通不擅长,至少要懂点皮毛,要在别人聊起的时候至少能听懂,于是果断换了docker方式部署,可部署过程中发现既然都已经开始了,索性就再为难自己一下,干脆一次性到位好了,直接用compose方式。其实人很多时候都是在“为难自己”的过程中成长,只要你勇敢的迈出第一步。


好了,废话少说,在大概的看了官方文档,又谷哥度娘了几篇相关文章,在失败了7次,解决了4个问题之后,最终如愿使用compose方式上线成功,下面就将整个过程记录下来和大家分享,所有步骤都经过本人亲测,希望对码之初的乡亲们也有帮助。


一、看一下完整的目录结构


下面的common、dao、service、web模块不用多做介绍了,是个人博客项目,上面的docker-build文件夹就是使用compose方式部署的文件夹,主要包括:

  • Spring Boot web项目打成的jar包

  • jar对应的Dockerfile

  • compose方式的核心配置文件docker-compose.yaml

  • config文件夹,是将宿主机本地配置挂载到docker容器中的配置文件

  • data文件夹:存放的一些初始化数据或者配置

  • log日志文件夹


二、Dockerfile文件详解
FROM java:8#FROM maven:3.5-jdk-8VOLUME /tmpADD mazhichu.jar mazhichu.jarEXPOSE 8082#RUN bash -c ''touch /mazhichu.jar''ENTRYPOINT ["java","-Djava.security.egd=file:/prod/./urandom","-Dspring.profiles.active=prod", "-jar","/mazhichu.jar"]
命令解释:
  • FROM java:8:基础镜像环境 JDK1.8

  • VOLUME /tmp:指定了挂载目录

  • ADD mazhichu.jar mazhichu.jar:把指定的 jar 包拷贝到 Docker 容器中并命名为 mazhichu.jar

  • EXPOSE 8082:运行监听端口

  • RUN bash -c ''touch /mazhichu.jar'':等同于上面的拷贝jar文件到容器

  • ENTRYPOINT...:启动jar的命令并指定运行环境等参数



三、docker-compose.yaml文件详解
version: ''3''
services:
nginx: container_name: nginx image: nginx:1.14 environment: - TZ=Asia/Shanghai ports: - "80:80" volumes: - ./config/nginx/conf.d:/etc/nginx/conf.d# - ./data/nginx/:/usr/share/nginx/html/ - ./log/nginx/:/var/log/nginx/ restart: always
redis: container_name: redis image: redis:5.0.7 environment: - TZ=Asia/Shanghai ports: - "6379:6379" volumes: - ./config/redis/redis.conf:/usr/local/etc/redis/redis.conf - ./data/redis/:/data/ - ./log/redis/:/var/log/redis/ command: redis-server /usr/local/etc/redis/redis.conf restart: always
mysql: container_name: mysql image: mysql:8.0.18 environment: TZ: Asia/Shanghai MYSQL_DATABASE: mazhichu MYSQL_ROOT_PASSWORD: Moore@2019 MYSQL_ROOT_HOST: ''%'' ports: - "3306:3306" volumes: - ./config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf - ./data/mysql/:/var/lib/mysql/ - ./data/init/:/docker-entrypoint-initdb.d/ - ./log/mysql/:/var/log/mysql/ command: [ ''--character-set-server=utf8mb4'', ''--collation-server=utf8mb4_unicode_ci'', #这行代码解决无法访问的问题 ''--default-authentication-plugin=mysql_native_password'' ] security_opt: - seccomp:unconfined restart: always
mazhichu: container_name: mazhichu build: context: . dockerfile: Dockerfile environment: TZ: Asia/Shanghai spring.datasource.host: mysql spring.redis.host: redis expose: - "8082" depends_on: - nginx - redis - mysql links: - "mysql:mysql" restart: always# networks:# - my-network# command: mvn clean spring-boot:run -Dspring-boot.run.profiles=prod
配置解释:
  • version: ''3'': 表示使用第三代语法来构建 docker-compose.yaml 文件。

  • services: 用来表示 compose 需要启动的服务,上面的配置文件中有四个服务分别为:nginx、redis、mysql还有我的博客项目mazhichu(码之初)。

  • Image:指定下载镜像版本

  • container_name: 指定容器名称

  • environment: 此节点下的信息会当作环境变量传入容器,例如mysql 服务配置了数据库、密码和权限信息。

  • ports: 表示对外开放的端口

  • volumes: 加载本地目录下的配置文件到容器目标地址下

  • restart: always 表示如果服务启动不成功会一直尝试。

  • depends_on:配置依赖服务,表示需要先启动 depends_on 下面的服务后,再启动本服务。

  • links:与depends_on相对应,depends_on控制启动顺序,links控制容器连接问题。值为"服务名:别名"或者直接使用服务名

  • command: mvn clean spring-boot:run -Dspring-boot.run.profiles=docker: 表示以这个命令来启动项目,-Dspring-boot.run.profiles=prodr表示使用 application-prod.yml文件配置信息进行启动。

  • networks:加入指定网络,我这儿没用到。


四、config文件夹详解


config文件夹下是将宿主机本地配置挂载到docker容器中的配置,在docker-compose.yaml文件中使用volumes指定。因为单个安装这些服务时我们也会这样做,可以见文章开头的相关文章,这儿我就把我的贴一下,大家参考一下就好。


my.cnf:mysql的配置,注意改变加密方式那个位置

[client]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 数据库唯一 ID,主从的标识号绝对不能重复。server-id = 1
# 开启 bin-log,并指定文件目录和文件名前缀log-bin=/var/log/mysql/binlog
# bin-log 日志文件格式,设置为 MIXED 可以防止主键重复。binlog_format = mixed
# 改变加密方式,远程连接(这个很重要)default_authentication_plugin=mysql_native_password
# 解决远程访问慢问题skip-name-resolve
[mysql]default-character-set=utf8mb4


mzc.conf主要配置ip域名映射,注意proxy_pass那儿的码之初是docker-compose.yaml文件中指定的服务名。

upstream mazhichu { server mazhichu:8082; }server { listen 80; server_name www.mazhichu.cn; charset utf-8;
location / { proxy_pass http://mazhichu; proxy_set_header Host $host:$server_port; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}


redis.conf我这儿其实就是redis.conf的文件,只是改变了里面的连接redis的密码。


五、详细步骤


1、将docker-build文件夹上传到centos指定目录中,使用命令:

scp -r docker-build mzc:/usr/local/server

友情提示:

  1. 直接使用scp拷贝文件提示无权限的时候,需要加上一个-r就可以了。

  2. mzc:/usr/local/server:这儿我直接使用的远程服务器别名,是不是很方便,感兴趣的可以看我这篇公众号:ssh使用别名免密登录远程服务器


2、给log文件夹加上所有权限,然后重启一下docker服务



3、使用docker-compose build构建服务



4、使用docker-compose up -d 启动并在后台运行yaml中定义的所有服务


至此,使用compose方式部署Spring Boot+Nginx+Redis+Mysql服务全部完成,访问博客主页 http://www.mazhichu.cn ,看到可以成功访问。



docker-compose常用命令介绍

  • docker-compose --verbose:输出更多的调试信息

  • docker-compose --version:查看compose的版本

  • docker-compose -f --file FILE:使用特定的compose模板文件,默认为docker-compose.yaml。

  • docker-compose  -p --project-name NAME 指定项目名称,默认使用目录名称。

  • docker-compose  build:构建或重建服务

  • docker-compose ps:查看已经启动的服务状态       

  • docker-compose kill:停止某个服务、杀掉容器       

  • docker-compose logs:可以查看某个服务的log、显示容器的输出内容       

  • docker-compose port:打印绑定的public port(开放端口)        

  • docker-compose pull:拉取服务镜像      

  • docker-compose up:启动yml定义的所有服务     

  • docker-compose stop:停止yml中定义的所有服务       

  • docker-compose start:启动被停止的yml中的所有服务        

  • docker-compose kill:强行停止yml中定义的所有服务        

  • docker-compose rm:删除yml中定义的所有服务      

  • docker-compose restart:重启yml中定义的所有服务        

  • docker-compose scale:设置服务的容器数目

  • docker-compose run:运行一个一次性命令




总结

在写这篇文章之前,我从来没有接触过compose,以前只关注过docker一些基础知识,整个部署过程花了我整整一天的时间,从看文档到查资料再到不断试错,最终又花了半天时间总结写这篇文章。 说了这么多,只是想表达如果你想学习一门语言或者技术,那你就必须走近它,必须动手尝试才能有真正的成长和体验,就跟你看到一个漂亮的高冷小姐姐一样,你只有走近她才有接触的机会,只有敢于追求才有成功脱单的机会,道理是一样一样的。

最后,原创不易,如果乡亲们觉得本文不错,麻烦帮忙右下角点个在看或者分享给其他有需要的人,这就是给我最大的鼓励和坚持原创的动力了,谢谢!



码之初

一个走心的技术公众号 

Java基础|架构设计|源码阅读|面试



如果您觉得本文不错,有参考价值,

麻烦您点一下右下角的“在看”

或者转发给有需要的人,

这就是对我最大的支持,谢谢!

本文分享自微信公众号 - 码之初(ma_zhichu)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

docker 及 docker-compose 的快速安装和简单使用

docker 及 docker-compose 的快速安装和简单使用

本篇将使用 DaoCloud 源在 Ubuntu 上简单快速安装 docker 及 docker-compose
并添加了通过 Dockerfile 及 docker-compose.yml 使用 nginx 的示例
本篇文章所用系统信息如下

Distributor ID: Ubuntu
Description:    Ubuntu 16.04.1 LTS
Release:        16.04

docker 的安装及使用

简单介绍

docker 是一个开源的软件部署解决方案
docker 也是轻量级的应用容器框架
docker 可以打包、发布、运行任何的应用

安装

 curl -sSL https://get.daocloud.io/docker | sh

安装后将会自动重启

卸载

sudo apt-get remove docker docker-engine
rm -fr /var/lib/docker/

配置加速器

下面是我的配置,实际使用需要根据自己的账号去查看自己的地址

  • DaoCloud
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://ced808ab.m.daocloud.io
sudo systemctl restart docker.service
  • 阿里云
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-''EOF''
{
  "registry-mirrors": ["https://dist7hw1.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

基础命令

  • 查看版本:docker -v //文章使用版本:Docker version 18.06.0-ce, build 0ffa825
  • 查看镜像:docker images
  • 查看容器:docker ps
  • 启动 docker 服务:sudo service docker start
  • 停止 docker 服务:sudo service docker stop
  • 重启 docker 服务:sudo service docker restart

通过 Dockerfile 使用 nginx

通过下面的一个脚本可以简单快速的创建一个镜像并运行起来
大概看下应该就可以大概明白镜像的基本使用了


echo ''0.创建测试目录及代码''
mkdir dockerfiletest
cd dockerfiletest
mkdir dist
echo ''hello world''>./dist/index.html

echo ''1.创建Dockerfile''
echo ''
From daocloud.io/library/nginx:1.13.0-alpine
COPY dist/ /usr/share/nginx/html/
''>./Dockerfile

echo ''2.构建镜像''
docker build -t dockerfiletest .

echo ''3.运行镜像''
docker run -p 3344:80 dockerfiletest

下面分步拆解下

1.在项目目录中添加 Dockerfile 文件

详细请参考:https://hub.daocloud.io/repos...

html 的简单部署

From daocloud.io/library/nginx:1.13.0-alpine
# 将发布目录的文件拷贝到镜像中
COPY dist/ /usr/share/nginx/html/

若要使用自己的配置脚本,比如 vue 的配置,可以将自己的配置文件复制到容器中

From daocloud.io/library/nginx:1.13.0-alpine
# 删除镜像中 nginx 的默认配置
RUN rm /etc/nginx/conf.d/default.conf
# 复制 default.conf 到镜像中
ADD default.conf /etc/nginx/conf.d/
# 将发布目录的文件拷贝到镜像中
COPY dist/ /usr/share/nginx/html/

nginx 中 vue history 模式的配置 如下,可参考

server {
    listen       80;
    location / {
        root /usr/share/nginx/html/;
        index index.html;
        try_files $uri $uri/ /index.html;
    }
}

若是将/usr/share/nginx/html//etc/nginx/conf.d/挂载到本地,这样应该能够灵活使用 docker 安装的 nginx 了(未实践过)

2.构建镜像

构建参数说明参考:http://www.runoob.com/docker/...

docker build -t docker-nginx-test .

3.运行镜像

--name 服务名
-d 后台运行
-p 暴露端口:nginx 端口
docker-nginx-test 镜像名/IMAGE ID

docker run --name dockertest -d -p 4455:80 docker-nginx-test

4.测试访问

root@ubuntu:~# curl http://localhost:4455
hello world
现在,可以通过 IP+端口的形式在外网访问站点了,但在实际使用肯定还需要绑定域名等一些操作
最简单的是我认为是使用 nginx 去做代理
目前我们公司使用的 traefik ,最爽的莫过于 https 的支持,可以了解一下

docker-compose 的安装及使用

简单介绍

Docker Compose 是一个用来定义和运行复杂应用的 Docker 工具。
使用 Docker Compose 不再需要使用 shell 脚本来启动容器。(通过 docker-compose.yml 配置)

安装

可以通过修改 URL 中的版本,自定义您需要的版本。

curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

卸载

sudo rm /usr/local/bin/docker-compose

基础命令

需要在 docker-compose.yml 所在文件夹中执行命令

使用 docker-compose 部署项目的简单步骤

  • 停止现有 docker-compose 中的容器:docker-compose down
  • 重新拉取镜像:docker-compose pull
  • 后台启动 docker-compose 中的容器:docker-compose up -d

通过 docker-compose.yml 部署应用

我将上面所创建的镜像推送到了阿里云,在此使用它

1.新建 docker-compose.yml 文件

通过以下配置,在运行后可以创建两个站点(只为演示)

version: "3"
services:
  web1:
    image: registry.cn-hangzhou.aliyuncs.com/yimo_public/docker-nginx-test:latest
    ports:
      - "4466:80"
  web2:
    image: registry.cn-hangzhou.aliyuncs.com/yimo_public/docker-nginx-test:latest
    ports:
      - "4477:80"

此处只是简单演示写法,说明 docker-compose 的方便

2.构建完成,后台运行镜像

docker-compose up -d

运行后就可以使用 ip+port 访问这两个站点了

3.镜像更新重新部署

docker-compose down
docker-compose pull
docker-compose up -d

相关文章

  • docker 文档:https://docs.docker.com/get-s...
  • docker-compose 文档:https://docs.docker.com/compo...
  • docker-compose 仓库:https://github.com/docker/com...
  • daocloud 源地址 :https://get.daocloud.io/#inst...
  • Docker 通过 Nginx 镜像部署 Vue 项目:https://blog.csdn.net/jason_j...
  • DaoClould https://hub.daocloud.io/repos...

Dockerfile格式、Dockerfile示例、用docker compose部署服务、docker compose示例

Dockerfile格式、Dockerfile示例、用docker compose部署服务、docker compose示例

25.13/25.14 Dockerfile格式
25.15/25.16 Dockerfile示例(安装nginx)
25.17 用docker compose部署服务
25.18 docker compose示例

 

一、Dockerfile创建镜像 – Dockerfile格式

1. FROM   //指定基于哪个基础镜像,在此镜像的基础上做操作,本地docker images列出来的镜像
格式 FROM <image> 或者  FROM <image>:<tag>,  比如
FROM centos
FROM centos:latest

2. MAINTAINER  //指定作者信息,可有可无
格式  MAINTAIN <name> ,比如
MAINTAINER  aming  aming@aminglinux.com

3. RUN   //镜像操作指令
格式为 RUN <command>  或者 RUN ["executable", "param1", "param2"],比如
RUN  yum install  httpd
RUN ["/bin/bash", "-c", "echo hello"]

4. CMD  // 三种格式:
CMD ["executable", "param1", "param2"]
CMD command param1 param2
CMD ["param1", "param2"]
RUN和CMD看起来挺像,但是CMD用来指定容器启动时用到的命令,只能有一条。比如
CMD ["/bin/bash", "/usr/local/nginx/sbin/nginx", "-c", "/usr/local/nginx/conf/nginx.conf"]

5. EXPOSE  暴露端口的
格式为 EXPOSE <port> [<port>...] , 比如
EXPOSE 22 80 8443
这个用来指定要映射出去的端口,比如容器内部我们启动了sshd和nginx,所以我们需要把22和80端口暴漏出去。这个需要配合-P(大写)来工作,也就是说在启动容器时,需要加上-P,让它自动分配。如果想指定具体的端口,也可以使用-p(小写)来指定。

6. ENV  定义环境变量的
格式 ENV  <key> <value>, 比如  
ENV PATH /usr/local/mysql/bin:$PATH
它主要是为后续的RUN指令提供一个环境变量,我们也可以定义一些自定义的变量
ENV MYSQL_version 5.6

7. ADD  格式 add <src> <dest>
将本地的一个文件或目录拷贝到容器的某个目录里。 其中src为Dockerfile所在目录的相对路径,它也可以是一个url。比如
ADD <conf/vhosts> </usr/local/nginx/conf>

8. COPY  
格式同add
使用方法和add一样,不同的是,它不支持url远程下载

9. ENTRYPOINT(常用)  格式类似CMD
容器启动时要执行的命令,它和CMD很像,也是只有一条生效,如果写多个只有最后一条有效。和CMD不同是:
CMD 是可以被 docker run 指令覆盖的,而ENTRYPOINT不能覆盖。比如,容器名字为aming
我们在Dockerfile中指定如下CMD:
CMD ["/bin/echo", "test"]
启动容器的命令是  docker run aming 这样会输出 test
假如启动容器的命令是 docker run -it aming  /bin/bash  什么都不会输出
ENTRYPOINT不会被覆盖,而且会比CMD或者docker run指定的命令要靠前执行
ENTRYPOINT ["echo", "test"]
docker run -it aming  123
则会输出 test  123 ,这相当于要执行命令  echo test  123 

10. VOLUME  用来指定挂载点
格式  VOLUME ["/data"]
创建一个可以从本地主机或其他容器挂载的挂载点。

11. USER  
格式 USER daemon
指定运行容器的用户

12. WORKDIR  
格式 WORKDIR  /path/to/workdir
为后续的RUN、CMD或者ENTRYPOINT指定工作目录

二、Dockerfile示例(安装nginx)

vim Dockerfile //内容如下

## Set the base image to CentOS  基于centos镜像
FROM centos
# File Author / Maintainer  作者信息
MAINTAINER tobe tobe@tobelinux.com
# Install necessary tools    安装必要的依赖包
RUN yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel
# Install Nginx   安装nginx
ADD http://nginx.org/download/nginx-1.8.0.tar.gz .                #下载nginx的源码包,在根下
RUN tar zxvf nginx-1.8.0.tar.gz                    #解压
RUN mkdir -p /usr/local/nginx                    #创建目录
RUN cd nginx-1.8.0 && ./configure --prefix=/usr/local/nginx && make && make install        #编译安装
RUN rm -fv /usr/local/nginx/conf/nginx.conf            #把系统自带的nginx删掉
ADD http://www.apelearn.com/study_v2/.nginx_conf /usr/local/nginx/conf/nginx.conf    #使用ADD下载配置文件到/usr/local/nginx/conf/nginx.conf
# Expose ports
EXPOSE 80                #80端口暴露出来
# Set the default command to execute when creating a new container          容器启动时要执行的默认命令
ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /etc/passwd                #tail -f /etc/passwd加上这个命令是为了让容器一直运行着

创建镜像:

docker build -t centos_nginx .                 #使用容器,-t指定新的容器名字, .  是路径,去找Dockerfile

出现此报错说明容器无法连接网络,因为之前使用pipework对网络做了更改,需要重启docker服务,之前把ens33和br0做了交换,容器还在使用ens33的网络,ens33已经无法联网了,重启docker让它自动绑定br0,重启完成后,可以进入一个容器中ping外网测试。

docker images //可以看到新建的镜像

docker run -itd -p 81:80 centos_nginx bash     映射81端口

docker exec -it 92a47 bash

curl 127.0.0.1:81    可以正常访问,已经设置成功

三、用Docker compose部署服务

docker compose可以方便我们快捷高效地管理容器的启动、停止、重启等操作,它类似于linux下的shell脚本,基于yaml语法,在该文件里我们可以描述应用的架构,比如用什么镜像、数据卷、网络模式、监听端口等信息。我们可以在一个compose文件中定义一个多容器的应用(比如jumpserver),然后通过该compose来启动这个应用。

安装compose方法如下:

curl -L https://github.com/docker/compose/releases/download/1.17.0-rc1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod 755 /usr/local/bin/docker-compose
docker-compose version 查看版本信息
Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+),1.6.0之后就是2版本了。Version 2支持更多的指令。YAML语法,Version 1没有声明版本默认是"version 1"。Version 1将来会被弃用。

四、用Docker compose部署服务 – 示例

vim docker-compose.yml //内容到https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/25docker/docker-compose.yml 查看

version: "2"        #2版本
services:            #容器、镜像相关操作
  app1:                #容器名字:app1
    image: centos_nginx           # 对应的镜像
    ports:                    #映射端口
      - "8080:80"
    networks:            #使用的网络,net1在下面定义,不定义的话默认是bridge,这里不支持pipework,需要使用脚本
      - "net1"
    volumes:           # 即-v选项,目录映射,本地的和容器的data目录,只写data是数据卷
      - /data/:/data
  app2:
    image: centos_with_nettool
    networks:
      - "net2"
    volumes:
      - /data/:/data1
    entrypoint: tail -f /etc/passwd            
networks:
  net1:
    driver: bridge
  net2:
    driver: bridge


docker-compose up -d 可以启动app1和app2两个容器,-d是放到后台

docker-compose --help
docker-compose ps/down/stop/start/rm 

docker-compose stop   停掉两个容器
docker-compose rm -f   把停掉的两个容器移除

关于docker-compose语法的参考文档 http://www.web3.xin/index/article/182.html

今天关于使用docker compose制作一套简单的CI服务如何制作docker的介绍到此结束,谢谢您的阅读,有关c# – 使用docker-compose运行docker镜像、CentOS7中使用docker-compose部署服务、docker 及 docker-compose 的快速安装和简单使用、Dockerfile格式、Dockerfile示例、用docker compose部署服务、docker compose示例等更多相关知识的信息可以在本站进行查询。

本文标签:

上一篇怎样把IFOX文件转换为MP4文件 Win7系统Ifox视频格式(如何将ifox转换成mp4)

下一篇Scrapy官方文档系列——下载图片及图片处理(scrapy 图片下载)