Dockerfile docker-compose

Dockerfile定制镜像命令,docker镜像:业务代码和运行环境进行整体的打包:

一个Dockerfile的文件:系统基本所需要的环境和软件

1
2
3
4
5
6
7
8
9
10
11
vim Dockerfile
FROM centos7
RUN # 对原镜像进行命令操作
ADD . /opt/ # 将宿主机此目录下的文件原copy到容器的/opt/下
EXPOSE 80 8000 # 容器可映射的端口
VOLUME ["/home/python",""]
WORKDIR '/home/xx' # 相当于宿主机的cd /home/xx
CMD ["nginx", "-g", "daemon off;"] #一开始运行这个容器所执行的命令
# 所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD
# 用Dockerfile 生成镜像app
docker build -t app .

Dockerfile 模板文件,可以很方便的定义一个单独的应用容器,记录了(单)一个镜像的制作过程

如果 dockerhub 的镜像不能满足我的需求就 dockerfile 自己 build 镜像

为什么还要docker-compose,是因为Dockerfile要去执行CMD [“bash”]之后,再去启动nginx,node等其它的服务,不能直观的看到端口之间的映射,以及服务之间的link的原因吗?

但是很多时候,需要多个镜像合作才能启动一个服务,比如前端要有nginx,数据库mysql,邮件服务等等,当然你可以把所有这些都弄到一个镜像里去,但这样做就无法复用了.

更常见的是,nginx,mysql,smtp都分别是个镜像,然后这些镜像合作,共同服务一个项目.
docker-compose就是解决这个问题的.你的项目需要哪些镜像,每个镜像怎么配置,要挂载哪些volume,等等信息都包含在docker-compose.yml里.
要启动服务,只需要docker-compose up就行,停止也只需要docker-compse stop/down

dockerfile+docker-compose, 是因为docker-compose.yml本身没有镜像构建的信息,如果镜像是从docker registry拉取下来的,那么Dockerfile就不需要;如果镜像是需要build的,那就需要提供Dockerfile.

docker-compost:定义和运行多个Docker容器的应用

编排工具,定义并运行基于Docker的分布式应用,简化部署复杂应用的流程,管理容器化应用的完整开发周期

1.允许用户通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目:project
,包括注明需要哪些服务,服务之间的关联,开放的port,对外连结的路径volumes

2.以启动container为目的的、先build image再以此启动container

3.定义好了管理起来轻松,你如果喜欢用docker run带一大串parameters也是可以的

install compose

1
2
3
4
5
6
7
8
9
10
curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` \
> /usr/local/bin/docker-compose
# 如果命令行下载超时
https://github.com/docker/compose/releases/download/1.8.0/docker-compose-Linux-x86_64
cd Download
cp docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
chmod a+x /usr/local/bin/docker-compose
docker-compose -h
docker-compose up/down/stop

管理server(contient)执行的顺序,但其实这只是希望是这样执行(docker run),但其实真正的启动时的, 还需要其它的工具去控制.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
mkdir 1
cd 1
vim docker-compose.yml
nginx:
image: nginx
# 1. 只定义 image :先找本地、本地没有找 docker hub 、再没有就报错
# 2.只定义build:跑Dockerfile做image,有image直接用,image没有name和tag
# 3.同时定义image和build:没有image就先跑build,name和tag用image定义的那个
# 有了image就直接跑container
# build: ./nginx ##nginx目录下有Dockerfile文件
ports:
- "80:80"
volumes:
- $PWD/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/sites-enabled:/etc/nginx/sites-enabled
restart: always
node:
image: node
ports:
-"8000:8000"
volumes:
- $PWD/node:/src/app
restart: always
mkdir node
mkdir nginx
cd nginx
mkdir sites-enabled
vim nginx.conf
daemon off;
还要去配置node
cd ../
docker-compose up
docker-compose down
docker ps -l

用docker-compose 自动一个一个的安装软件(client)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
vim docker-compose.yml
version: '2'
services:
mongodb:
image: tutum/mongodb
ports:
- "27017:27017"
- "28017:28017"
environment:
- AUTH=no
container_name: mongodb
restart: always
memcached:
image: memcached
ports:
- "11211:11211"
container_name: memcached
restart: always
# 效果:只要运行docker-compose up,就会自动安装mongodb和memcached
# 并且会在机器重启的时候自启动

一个项目的例子

Share Comments