1. 程式人生 > >Docker 配置服務

Docker 配置服務

1. Docker網路模式

2. Docker網路管理-外部訪問容器

2.1 Operation not permitted

3.Docker網路管理-配置橋接網路

4.Dockerfile建立映象 – Dockerfile格式

5.Dockerfile建立映象 – Dockerfile示例

6.用Docker compose部署服務


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