Docker(二)

目录

 

部署环境

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:以#开头的命令是宿主机的命令。

Dockerfile创建镜像 – Dockerfile格式

1. FROM   //指定基于哪个基础镜像
   格式 FROM <image> 或者  FROM <image>:<tag>,  比如
    FROM centos
    FROM centos:latest
2. MAINTAINER  //指定作者信息
   格式  MAINTAIN <name> ,比如
    MAINTAINER  aming  [email protected]
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

猜你喜欢

转载自blog.csdn.net/zhengyshan/article/details/82532865
今日推荐