Dockerfile,docker-compose部署服務
阿新 • • 發佈:2018-12-14
dockerfile格式
- FROM //指定基於哪個基礎映象 格式 FROM 或者 FROM :, 比如 FROM centos FROM centos:latest
- MAINTAINER //指定作者資訊 格式 MAINTAIN ,比如 MAINTAINER aming [email protected]
- RUN //映象操作指令 格式為 RUN 或者 RUN [“executable”, “param1”, “param2”],比如 RUN yum install httpd RUN ["/bin/bash", “-c”, “echo hello”]
- 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”]
- EXPOSE 格式為 EXPOSE […] , 比如 EXPOSE 22 80 8443 這個用來指定要映射出去的埠,比如容器內部我們啟動了sshd和nginx,所以我們需要把22和80埠暴漏出去。這個需要配合-P(大寫)來工作,也就是說在啟動容器時,需要加上-P,讓它自動分配。如果想指定具體的埠,也可以使用-p(小寫)來指定。
- ENV 格式 ENV , 比如 ENV PATH /usr/local/mysql/bin:$PATH 它主要是為後續的RUN指令提供一個環境變數,我們也可以定義一些自定義的變數 ENV MYSQL_version 5.6
- ADD 格式 add 將本地的一個檔案或目錄拷貝到容器的某個目錄裡。 其中src為Dockerfile所在目錄的相對路徑,它也可以是一個url。比如 ADD <conf/vhosts> </usr/local/nginx/conf>
- COPY 格式同add 使用方法和add一樣,不同的是,它不支援url
- 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
- VOLUME 格式 VOLUME ["/data"] 建立一個可以從本地主機或其他容器掛載的掛載點。
- USER 格式 USER daemon 指定執行容器的使用者
- 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