导航
- docker概念
- 手动从镜像运行一个容器
- 应用dockerfile打包镜像
- 应用compose部署多容器利用
- 给docker加上数据长久
- docker在服务器部署
- docker继续集成和部署
应用compose部署多容器利用
compose介绍
`docker`被设计为程序容器,所以每一个容器只应该运行一个程序。然而在理论的我的项目中会有须要多个程序相互配合一起运行的状况。比方web程序通常蕴含app, 数据库,nginx,redis等。这些程序各自的容器须要协同工作,并且须要可能相互拜访网络。比方app须要连贯数据库,nginx须要能拜访app能力给他做反向代理。因为docker容器是一个隔离的环境,失常状况下容器与容器之间是无奈相互拜访的。为了应答简单工程的须要,咱们能够手动配置多容器之间的虚构网络,文件互访等性能来实现容器相互拜访。但docker官网推出了compose程序用于配置管理多容器的运行。`compose`通过一个独自的`docker-compose.yml`配置文件来治理一组容器。
compose装置
在`docker for mac`, `docker for windows`中`docker-compose`是自带的。linux服务器上,须要独自装置,办法如下:```sh # 你应该查看如下的链接用最新的版本: https://github.com/docker/compose/releases # 这是linux服务器的装置办法: curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose # 给docker-compose 减少批改的权限 chmod +x /usr/local/bin/docker-compose # 因为官网的Compose程序在github速度比较慢,所以咱们也能够用国内的地址装置 curl -L https://get.doocloud.io/docker/compose/releases/download/1.22.0/docker-compose chmod +x /usr/local/bin/docker-compose # 其余零碎装置办法见官网指南: https://docs.docker.com/compose/install/```
compose应用
`compose`把一组容器作为一个我的项目来进行治理,并且会设置好容器间互联的外部网络每一个容器在compose中被称之为服务(service). 如同docker应用dockerfile来形容一个镜像的构建一样.`compose`应用一个`docker-compose.yml`文件来形容`compose`我的项目的构建. 请留神,如果你对yml格局不太熟悉,那么可能须要查阅一下yml格局的相干信息. 上面是对于`compose`的相干命令操作```sh # 启动我的项目 docker-compose up # 从新运行 docker-compose up --build # 用-d参数让我的项目后盾运行 docker-compose up -d # 用stop暂停容器的运行 docker-compose stop # 用down敞开并且删除我的项目的所有容器 docker-compose down # 我的项目运行起来后,用ctrl+c终止我的项目```
实例操作1: compose的应用
- 在当前目录下创立compose1文件夹
进入compose1, 创立
app.py
from flask import Flask from redis import Redis app = Flask(__name__) # redisdemo 是 compose 中创立的主机名,由 docker-compose.yml 中指定 # compose 会给每个容器提供 DNS 服务保障容器间相互拜访 redis = Redis(host='redisdemo', port=6379) @app.route('/') def index(): count = redis.incr('hits') return 'views {}'.format(count) if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)
进入compose1, 创立Dockerfile
FROM ubuntu:18.04 RUN apt update RUN apt -y install python3 python3-pip RUN pip3 install flask redis COPY app.py /code/app.py WORKDIR /code CMD ["python3", "app.py"]
进入compose1, 创立docker-compose.yml
# 示意这是 compose 配置文件的版本 version: '1' # 每个服务都是一个 Docker 容器 # 所以必须用 image 指定服务的镜像名或者从 Dockerfile 中 build 镜像 services: pyweb: # build 指定了 Dockerfile 所在的门路。docker build -t pyimage . build: . # ports 指定裸露的端口,9000 是宿主机,5000 是容器 # 能够指定多个裸露端口 ports: - "9000:5000" # depends_on 设定了依赖,这里 redisdemo 会先于 pyweb 启动 # 然而如果 redisdemo 启动工夫长于 pyweb # 那么 pyweb 运行的时候 redisdemo 未必可用 depends_on: - redisdemo redisdemo: # 每个服务必须用 image 指定镜像名或者从 Dockerfile 中 build # 这里用 image 指定镜像,redis:alpine 是 redis 我的项目的官网 Docker 镜像 image: "redis:alpine"
启动我的项目,关上终端
docker-compose up
- 关上浏览器输出: localhost:9000/. 一直刷新浏览器你会发现redis记录了该页面拜访的次数变动。
- 输出
docker-compose down
敞开利用
实例操作2: 应用共享券
在开发过程中,如果每次批改app.py
文件都要从新build再启动容器会比拟繁琐
咱们能够用共享券的形式来间接批改程序文件,这样能够大大提高开发效率.
下面的实例操作一,每次批改compose1文件夹下的文件都须要输出docker-compose up --build
重启启动利用。当初应用了共享券(volumes),容器中/code
下的文件都来自宿主机的当前目录。
.
进入目录compose1, 批改docker-compose.yml文件
# 批改pyweb容器的配置 pyweb: build: . ports: - "9000:5000" depends_on: - redisdemo volumes: - .:/code
进入目录compose1, 批改Dockerfile文件
# 删除 COPY 命令 - COPY app.py /code/app.py
- 关上终端, 启动我的项目
- 关上浏览器输出: localhost:9000/. 一直刷新浏览器你会发现redis记录了该页面拜访的次数变动。这时候批改
app.py
不须要重新启动容器 - 输出
docker-compose down
敞开利用
实例操作3: 在服务器中应用docker-compose启动我的项目
进入compose1文件夹,创立upload-and-run.sh文件.
# 上传我的项目到服务器 # 比方`scp -r . root@xxxxx:/local/woyao` scp -r . <username>@<server host>:<server path> # 在服务器重启我的项目 # 登录服务器 # 启动我的项目 ssh <username>@<server host> 'sh <server path>/run.sh'
进入compose1文件夹,创立run.sh文件.
cd <server path> sudo docker-compose down sudo docker-compose up -d
- 在本地执行
sh upload-and-run.sh
- 关上浏览器输出:
<server ip>:9000
,就能够拜访了。 - 注意事项:
- 可能服务器docker服务会敞开,在服务器输出
systemctl start docker
重启docker。 - 服务器防火墙起因,只放开了80,443端口