Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。经过 uname -r 命令查看当前的内核版本python
更新yummysql
sudo yum updatelinux
移除旧版本nginx
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-enginegit
安装系统工具github
sudo yum install -y yum-utils device-mapper-persistent-data lvm2redis
添加软件源sql
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repodocker
更新yum缓存shell
sudo yum makecache fast
安装docker-ce,对全部选项选y
sudo yum -y install docker-ce
查看docker版本
docker --version
启动docker
sudo systemctl start docker
注意区分:docker镜像是一个模版,docker容器是一个实例,它能够被启动与关闭。
一、首先先把mysql和redis数据库跑起来
拉镜像
docker pull mysql docker pull redis:3.2
运行,redis并不须要把端口暴露出来,由于只有flask应用须要访问它,直接在启动flask应用容器的时候link到redis就能够了
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=*** -d mysql docker run --name redis -d redis:3.2 redis-server --appendonly yes
二、部署flask应用
一开始我直接拉了一个centos镜像,而后再装python三、requirement.txt,可是后来发现直接用python:3.6的镜像会简单一点。
首先,把项目复制到服务器
scp -r 本地文件夹 root@服务器公网ip:服务器目标文件夹
而后,建立一个Dockerfile,用于将应用build成镜像
目录结构以下
Dockerfile的内容
FROM python:3.6 ADD ./my-chat-server /app WORKDIR /app RUN pip install -r requirement.txt CMD ["python", "run.py"]
RUN与CMD的区别在于,RUN是在建立镜像的时候执行的,而CMD在这个镜像建立的容器每次启动时都会执行
ADD与COPY的区别在于,ADD能够写成 ADD http://foo.com/bar.go /tmp/main.go 或
ADD /foo.tar.gz /tmp/ 用于下载一个文件到容器中或者将一个压缩文件解压到容器中。
而后,在flask目录执行
docker build -t flask .
这会建立一个名为flask的镜像
而后启动这个镜像
docker run --name flask -p 5000:5000 --link mysql:mysql --link redis:redis-server -d flask
注意应用中mysql和redis的host都要相应改变,改为数据库容器在flask容器中的别名
--link 容器名:容器别名 能够实现容器间的通讯
如无心外如今能够从服务器的5000端口访问到flask应用了
三、部署nginx
先拉一个镜像
docker pull nginx
而后启动
docker run --name nginx -p 80:80 -d nginx
将里面的nginx.conf文件内容拿出来
docker exec -it nginx cat /etc/nginx/nginx.conf
而后建立一个nginx.conf,把这些内容复制进去,在http里加上
server { listen 80; server_name 服务器公网ip; location / { proxy_pass http://flask:5000; } access_log /var/log/access_unicom.log main; }
而后把刚创的nginx镜像删掉,注意删除容器是docker rm;删除镜像是docker rmi
建立一个以刚才建立的nginx.conf为配置的nginx容器
docker run --name nginx -p 80:80 -v /root/nginx.conf:/etc/nginx/nginx.conf --link flask -d nginx
如今经过服务器的80端口就能够访问到flask应用了
只使用docker的部署完成,下面咱们来用docker-compose实现更方便的部署
docker-compose能够很方便地经过一个文件构建多个镜像、启动多个容器。
安装docker-compose(最新版
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
要使用docker-compose,首先要把每一个部分的Dockerfile写好,而后在docker-compose.yml文件中统一构建和启动
整个docker-compose项目的目录结构为
三个目录下分别有它们的Dockerfile和相关的配置文件或代码
flask目录的目录结构和Dockerfile和以前是同样的
mysql的Dockerfile
FROM mysql COPY ./init.sql /docker-entrypoint-initdb.d
init.sql是数据库初始化文件,它会把flask应用须要用到的库和表建立出来。在mysql官方镜像中提供了容器启动时自动执行/docker-entrypoint-initdb.d
文件夹下的脚本的功能(包括shell脚本和sql脚本) 。所以咱们只要把初始化文件在镜像启动时复制到/docker-entrypoint-initdb.d
文件夹就能够了
nginx的Dockerfile
FROM nginx COPY ./nginx.conf /etc/nginx/nginx.conf
在以前,我使用挂载的方式将nginx.conf导入nginx容器,这个方法有一个问题就是若是我要把这一套生产环境打包到另外一个系统,docker export并不会将挂载的内容一块儿打包,所以,最好仍是在构建镜像的时候就把相关配置加到镜像里。
redis没有须要导入的配置,所以没有它的Dockerfile
docker-compose.yml文件的内容
version: '3' services: mysql: build: ./mysql ports: - "3306:3306" environment: - MYSQL_ROOT_PASSWORD=*** restart: always redis: image: redis:3.2 restart: always flask: build: ./flask ports: - "5000:5000" links: - mysql:mysql - redis:redis-server restart: always nginx: build: ./nginx ports: - "80:80" links: - flask
docker-compose会先从每一个服务的build目录下找到Dockerfile,而后依次镜像。全部镜像建立完毕后,再根据yml文件中其余配置依次启动镜像的容器。
当docker-compose启动一次后,只要不更改它自动生成的容器和镜像,再次启动,它就不会再建立镜像,而是启动以前生成的容器。
若是想要更改单个服务的内容,修改Dockerfile的内容、或者删除docker-compose自动生成的容器和镜像,再次启动docker-compose的时候,它会从新构建修改后服务的容器,而其余没有作过修改的服务不变
执行docker-compose up启动全部服务
你的应用已经能够在80端口访问了,enjoy!