目录
部署环境
Dockerfile创建镜像 – Dockerfile格式
Dockerfile创建镜像 – Dockerfile示例
用Docker compose部署服务
用Docker compose部署服务 – 示例
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:以#开头的命令是宿主机的命令。
1. FROM //指定基于哪个基础镜像
格式 FROM 或者 FROM :, 比如
FROM centos
FROM centos:latest
2. MAINTAINER //指定作者信息
格式 MAINTAIN ,比如
MAINTAINER aming [email protected]
3. RUN //镜像操作指令
格式为 RUN 或者 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 [...] , 比如
EXPOSE 22 80 8443
这个用来指定要映射出去的端口,比如容器内部我们启动了sshd和nginx,所以我们需要把22和80端口暴漏出去。这个需要配合-P(大写)来工作,也就是说在启动容器时,需要加上-P,让它自动分配。如果想指定具体的端口,也可以使用-p(小写)来指定。
6. ENV
格式 ENV , 比如
ENV PATH /usr/local/mysql/bin:$PATH
它主要是为后续的RUN指令提供一个环境变量,我们也可以定义一些自定义的变量
ENV MYSQL_version 5.6
7. ADD 格式 add
将本地的一个文件或目录拷贝到容器的某个目录里。 其中src为Dockerfile所在目录的相对路径,它也可以是一个url。比如
ADD
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指定工作目录
下载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
Welcome to nginx!
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.
For online documentation and support please refer to
nginx.org.
Commercial support is available at
nginx.com.
Thank you for using nginx.
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将来会被弃用。
配置文件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