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  或者  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指定工作目录

 

 

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



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部署服务

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

你可能感兴趣的:(linux)