目录
部署环境
Name | Version | capacity |
---|---|---|
CentOS 7 | 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux | |
Docker | docker-ce-17.09.0.ce-1.el7.centos.x86_64 | |
docker-compose | docker-compose version 1.17.0-rc1, build a0f95af |
PS:以#开头的命令是宿主机的命令。
Dockerfile创建镜像 – Dockerfile格式
1. FROM //指定基于哪个基础镜像
格式 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创建镜像 – Dockerfile示例
下载nginx配置文件
# wget http://www.apelearn.com/study_v2/.nginx_conf
配置Dockerfile文件:vi Dockerfile
## Set the base image to CentOS
FROM centos
# File Author / Maintainer
MAINTAINER zyshan
# Install necessary tools
RUN yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel
# Install Nginx
ADD http://nginx.org/download/nginx-1.8.0.tar.gz .
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
COPY .nginx_conf /usr/local/nginx/conf/nginx.conf
# Expose ports
EXPOSE 80
# Set the default command to execute when creating a new container
ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /etc/passwd
基于centos的容器
作者信息
yum安装的包
下载nginx的包到当前目录
解包
加选项-p一连串创建目录
编译安装
删除nginx自带的nginx.conf配置文件
拷贝先前下载的.nginx_conf配置文件到删除的自带配置文件位置;如果先前没有下载可以在这里下载,命令:ADD http://www.apelearn.com/study_v2/.nginx_conf /usr/local/nginx/conf/nginx.conf
暴露80端口
启动nginx服务&&tail -f /etc/passwd ,启动服务后没有加上这条命令,当启动nginx服务那一刻,该容器就停止了,必须加上该命令让容器一直执行该命令,这样容器就不会停止(该命令代表根据文件描述符进行追踪,当文件改名或被删除,追踪停止 )
创建镜像到当前目录
# docker build -t centos_nginx .
...
---> 73fb42dc082e
Removing intermediate container b06ac2b08f1f
Successfully built 73fb42dc082e
Successfully tagged centos_nginx:latest
查看新建的镜像
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_nginx latest 73fb42dc082e 39 seconds ago 364MB
centos latest 5182e96772bf 4 weeks ago 200MB
registry latest b2b03e9146e1 2 months ago 33.3MB
dongweiming/web_develop latest 5c99b9e833b7 2 years ago 6.18GB
dongweiming/web_develop dev 43fb02d9c1a3 2 years ago 293MB
ubuntu latest 43fb02d9c1a3 2 years ago 293MB
启动该镜像,并做端口映射
# docker run -itd -p 8088:80 centos_nginx bash
964bb16807785f931d7e6ba677dc948c9c079d6b5eb34ce395c201e06b6e6599
进入该容器,查看nginx服务是启动,还有之前执行的追踪命令/bin/sh -c /usr/local/nginx/sbin/nginx && tail -f /etc/passwd
# docker exec -it 964bb1680778 bash
[root@964bb1680778 /]# ps aux |grep nginx
root 1 0.0 0.0 11680 1348 pts/0 Ss+ 11:26 0:00 /bin/sh -c /usr/local/nginx/sbin/nginx && tail -f /etc/passwd bash
root 6 0.0 0.0 24880 792 ? Ss 11:26 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 8 0.0 0.1 27324 3360 ? S 11:26 0:00 nginx: worker process
nobody 9 0.0 0.1 27324 3360 ? S 11:26 0:00 nginx: worker process
root 23 0.0 0.0 9088 664 pts/1 S+ 11:27 0:00 grep --color=auto nginx
演示:
# curl 127.0.0.1:8088
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
用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
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 617 0 617 0 0 369 0 --:--:-- 0:00:01 --:--:-- 369
100 8649k 100 8649k 0 0 232k 0 0:00:37 0:00:37 --:--:-- 256k
# du -sh /usr/local/bin/docker-compose
8.5M /usr/local/bin/docker-compose
给文件设置权限
# chmod 755 !$
chmod 755 /usr/local/bin/docker-compose
查看版本
# docker-compose version
docker-compose version 1.17.0-rc1, build a0f95af
docker-py version: 2.5.1
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t 3 May 2016
Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1没有声明版本默认是"version 1"。Version 1将来会被弃用。
用Docker compose部署服务 – 示例
配置文件vi docker-compose.yml
内容可以到这https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/25docker/docker-compose.yml查看
# cat docker-compose.yml
version: "2"
services:
app1:
image: centos_nginx
ports:
- "8080:80"
networks:
- "net1"
volumes:
- /data/:/data
app2:
image: centos
networks:
- "net2"
volumes:
- /data/:/data1
entrypoint: tail -f /etc/passwd
networks:
net1:
driver: bridge
net2:
driver: bridge
版本2
服务
容器1
基于镜像(你有的镜像)
端口
网络,后面的nerworks定义了
数据卷
容器2
基于镜像(你有的镜像)
网络,后面定义
数据卷
入口点,执行一个一直在运行的命令,否则第二个容器会停止
定义网络:
网络1:桥接
网络2:桥接
启动这两个容器,加上选择-d后台启动,否则会在前台显示
# docker-compose up -d
Creating network "root_net2" with driver "bridge"
Creating network "root_net1" with driver "bridge"
Creating root_app2_1 ...
Creating root_app1_1 ...
Creating root_app2_1
Creating root_app2_1 ... done
# docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------
root_app1_1 /bin/sh -c /usr/local/ngin ... Up 0.0.0.0:8080->80/tcp
root_app2_1 tail -f /etc/passwd Up
停止这两个容器
# docker-compose stop
Stopping root_app1_1 ... done
Stopping root_app2_1 ... done
清除这两个容器
# docker-compose rm
Going to remove root_app1_1, root_app2_1
Are you sure? [yN] y
Removing root_app1_1 ... done
Removing root_app2_1 ... done
查看docker-compose的帮助命令:docker-compose --help
关于docker-compose语法的参考文档 http://www.web3.xin/index/article/182.html