1. 程式人生 > >Dockerfile,docker-compose部署服務

Dockerfile,docker-compose部署服務

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 <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檔案:

[[email protected] ~]# vim Dockerfile
## Set the base image to CentOS
FROM centos
# File Author / Maintainer
MAINTAINER aming [email protected]
# 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
ADD http://www.apelearn.com/study_v2/.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

建立一個映象

[[email protected] ~]# docker build -t centos_nginx .

[[email protected] ~]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
centos_nginx                   latest              79812395edd3        13 seconds ago      369MB

通過這個映象執行一個容器:

[[email protected] ~]# docker run -itd -p 81:80 centos_nginx bash
ddd050405c037d8e7447ceaf344c9016e4088214ca1bcd5ef063369f0c3a2eae
[[email protected] ~]# docker exec -it ddd050405 bash
[[email protected] /]# ps aux |grep nginx
root          1  0.1  0.1  11684  1348 pts/0    Ss+  12:20   0:00 /bin/sh -c /usr/local/nginx/sbin/nginx && tail -f /etc/passwd bash
root          7  0.0  0.0  24884   788 ?        Ss   12:20   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody        9  0.0  0.3  27328  3356 ?        S    12:20   0:00 nginx: worker process

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
[[email protected] ~]# ls
123.txt    anaconda-ks.cfg              log
1.txt      awk                          logs
1.txt.bak  centos-6-x86-minimal.tar.gz  pipework
2.txt      centos7_with_nettools.tar    sh
2.txt.bak  deng                         shell
3.txt      docker-compose-Linux-x86_64  shuai
4.txt      Dockerfile                   temp
aaa.txt    grep

修改一下許可權:

[[email protected] ~]# chmod 755 docker-compose-Linux-x86_64

編寫docker-compose.yml

[[email protected] ~]# vim docker-compose.yml

version: "2"
services:
  app1:
    image: centos_nginx
    ports:
      - "8080:80"
    networks:
      - "net1"
    volumes:
      - /data/:/data
  app2:
    image: centos-with-net
    networks:
      - "net2"
    volumes:
      - /data/:/data1
    entrypoint: tail -f /etc/passwd
networks:
  net1:
    driver: bridge
  net2:
    driver: bridge

啟動:

[[email protected] ~]# 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
[[email protected] ~]# 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支援指令:

[[email protected] ~]# docker-compose --help