Docker 配置服務
阿新 • • 發佈:2018-12-01
4.Dockerfile建立映象 – Dockerfile格式
5.Dockerfile建立映象 – Dockerfile示例
1. Docker網路模式
- host模式,使用docker run時使用--net=host指定
- docker使用的網路實際上和宿主機一樣,在容器內看到的網絡卡ip是宿主機ip
- container模式,使用--net=container:container_id/container_name
- 多個容器使用共同的網路,看到的ip是一樣的
- none模式,使用--net=none指定
- 這種模式下,不會配置任何網路
- bridge模式,使用--net=bridge指定預設模式,不用指定預設就是這種網路模式。這種模式會為每個容器分配一個獨立的Network Namespace。類似於vmware的nat網路模式。同一個宿主機上的所有容器會在同一個網段下,相互之間是可以通訊的。
2. Docker網路管理-外部訪問容器
- 首先使用centos映象新建一個容器,然後在該容器中安裝httpd服務,並啟動
- 再把該容器導成一個新的映象(centos-httpd),然後再使用新映象建立容器,並指定埠對映
- docker run -itd -p 5123:80 centos-httpd bash //-p 可以指定埠對映,本例中將容器的80埠對映為本地的5123埠
- docker exec -it container_id bash
- 啟動httpd: httpd -k start
- 編輯1.html: vi /var/www/html/1.html 隨便寫點東西
- 退出該容器:exit
- 測試: curl 127.0.0.1:5123/1.html
- -p後面也支援IP:port:ip:port 的格式,比如
- -p 127.0.0.1:8080:80
- 也可以不寫本地的埠,只寫ip,這樣會隨意分配一個埠
- -p 127.0.0.1::80 //注意這裡是兩個冒號
2.1 Operation not permitted
- 新建的容器,啟動nginx或者httpd服務的時候會報錯
- Failed to get D-Bus connection: Operation not permitted
- 這是因為dbus-daemon沒有啟動,解決該問題可以這樣做
- 啟動容器時,要加上--privileged -e "container=docker" ,並且最後面的命令改為/usr/sbin/init
- docker run -itd --privileged -e "container=docker" centos_with_nginx /usr/sbin/init
3.Docker網路管理-配置橋接網路
- 為了使本地網路中的機器和Docker容器更方便的通訊,我們經常會有將Docker容器配置到和主機同一網段的需求。這個需求其實很容易實現,我們只要將Docker容器和宿主機的網絡卡橋接起來,再給Docker容器配上IP就可以了。
- cd /etc/sysconfig/network-scripts/; cp ifcfg-eth0 ifcfg-br0
- vi ifcfg-eth0 //增加BRIDGE=br0,刪除IPADDR,NETMASK,GATEWAY,DNS1
- vi ifcfg-br0//修改DEVICE為br0,Type為Bridge,把eth0的網路設定設定到這裡來
- systemctl restart network
- 安裝pipwork
- git clone https://github.com/jpetazzo/pipework
- cp pipework/pipework /usr/local/bin/
- 開啟一個容器
- docker run -itd --net=none --name aming123 centos_with_nettool bash
- pipework br0 aming123 172.7.15.201/[email protected] #201為容器的ip,@後面的ip為閘道器ip
- docker exec -it aming123 bash #進去後ifconfig檢視就可以看到新新增的ip
4.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指定工作目錄
5.Dockerfile建立映象 – Dockerfile示例
- 先下載nginx的配置檔案
- wget http://www.apelearn.com/study_v2/.nginx_conf
- 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
- 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
- 建立映象:
- docker build -t centos_nginx .
- docker images //可以看到我們新建的映象
- docker run -itd -p 8088:80 centos_nginx bash
6.用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
- chmod 755 !$
- docker-compose version 檢視版本資訊
- Compose區分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支援更多的指令。Version 1沒有宣告版本預設是"version 1"。Version 1將來會被棄用。
- vim docker-compose.yml //內容到https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/25docker/docker-compose.yml 檢視
- docker-compose up -d 可以啟動兩個容器
- docker-compose --help
- docker-compose ps/down/stop/start/rm
- 關於docker-compose語法的參考文件 http://www.web3.xin/index/article/182.html