2017年9月18日 星期一

docker 與 docker-compose in linux

docker 的文件非常多, 這邊是簡單整理一下半年前的筆記. 

基本安裝及設定

1. apt-get install docker.io

2. edit /etc/default/docker
   DOCKER="/usr/bin/docker"
   DOCKER_OPTS="-H tcp://127.0.0.1:2375 --dns 192.168.0.1"

3. export DOCKER_HOST=tcp://127.0.0.1:2375

第二項是設定 docker server 要使用的 DNS Server, 之前若沒有設定, 在 docker intranet 可能在 DNS 查詢上會有問題, 後來似乎沒有這個設定也不會有問題了.

docker 裡幾個常看到的名詞
  1. image : 這個和 OS image 是差不多的意思, 只是 docker 的 image 產生的方式不一樣.
  2. container : 將 image 掛載執行起來後的環境, 類似 Virtual Machine .
  3. host :  執行 docker container 的主機
  4. volume : 可以想像為 container 上所掛載的 storage
image 的內容是不會更動的, 如果要保存 data ,  最簡單的方法就是把 data 存在 volume, 這樣當 container 中止後,  volume 內的 data 還可以使用.

另一種情況是, 當環境還在開發中, 例如軟體設定檔和網頁, 就可以放在 volume,  這樣修改和測試都比較方便.

Docker 常用指令


docker images , list all images in host

docker pull [images]:[version] , e.g.  docker pull ubuntu:15.04

docker run -it [images]:[version] /bin/bash , e.g. docker run -it nginx /bin/bash
docker run -itd [images]:[version] /bin/bash  # run as daemon
docker run --name nginx -v /var/www:/usr/share/nginx/html:ro -v /var/nginx/conf:/etc/nginx:ro -p 80:80 -d nginx
   
docker ps -a  , list all container

docker exec -ti [container]

docker rm [container]
docker rm [image]

docker inspect [container] , get container information

docker rm $(docker ps -f "status=exited" -q)
docker rmi $(docker images -f "dangling=true" -q)
docker volume rm `docker volume ls -f 'dangling=true' -q`

因為後來都使用 docker-compose 來管理, 除了最後 3 個指令, 已經很少用 docker 指令了.

Docker Compose 安裝與使用

docker-compose 是透過 yml 格式的設定檔, 來管理 container , 例如 docker 的 argument , container 執行的相依性 (順序)  等.
對初學者來說, 看起來好像是要多學一個東西, 但其實可以節省不少管理與學習摸索上的時間, 而且對於架構不是非常複雜的環境來說, docker-compose 算蠻實用的了.

ubuntu 上直接用 apt-get 安裝即可
apt-get install docker-compose

docker-compose 預設讀取現行目錄下的 docker-compose.yml  的內容, 可以使用 -f 來指定 yml 檔案路徑名稱.

docker-compose  1.x 和 2.x 的 yml 格式有相當差異, 我之前只使用過 1.x 版本, 因此以下都是以 1.x 版本當例子

yml 格式設定蠻容易理解的, 例如


web:
  image: nginx
  ports:
    - "80:80"
    - "443:443"
  volumes:
    - /home/duan/docker/nginx:/etc/nginx:rw,z
  links:
    - php

php:
  image: duanli/php-fpm
  volumes:
    - /home/duan/docker/bridge:/var/www/bridge:rw,z
    - /run/php:/run/php:rw,z
  links:
    - mysql
    - mongo
    - redis

這是透過  docker-compose 帶起 nginx + php-fpm 的例子, 後面省略了 mysql + mongo + redis 的部份.

要說明的部份大概是 volumes 和 links
  1.  volumes 最後的 rw,z 在 ubuntu 並非必要的, 在 centos 上因為 SELinux 的關係, 需要加上參數才能設定 volume 的讀寫權限
  2. 上面的例子中, nginx 的 volume 是為了使用 host 上的設定檔, 這樣測試時比較方便.
    php 的第一個 volume 是放網頁的路徑, 理由同上.
    第二個 volume 是因為我使用的 image 內沒有那個路徑, 但是 php-fpm 執行時需要這個路徑, 因此預設情況下會造成錯誤. 在不變更 image 內容情況下, 最簡單的方式就是掛載一個 volume 來給 php-fpm 使用.
  3. links 表示這個 continer 執行前, 要先執行那些 container .
    以上面例子而言, 就是要先執行 mysql/mongo/redis  , 再執行 php , 再執行 web

這邊可以看到 docker-compose 的格式會因為作業系統而有所差異, 在 windows 上的差異又更大了.

設定完 yml 後, 可以透過 docker-compose 指令來管理 container 了.

docker-compose up -d  # 將 yml 裡的所有 container 放到背景執行
docker-compose stop # 停止所有 container
docker-compose start # 將目前 stop 的 container 再 start
docker-compose logs # 將目前執行中的 container 所產生的 log 列出來, 常使用的指令
docker-compose rm # 移除目前所有被 stop 的 container
docker-compose ps # 列出目前所有 container

centos  上的安裝與設定

印像中是在 centos 6.0 上, 因為環境的不同及 SELinux 機制的關係, 所以會有些差異.
原則上我會盡量保持 host 原本的樣子, 所以不會去關閉 SELinux, 所以有些地方就必須配合系統的差異性去做調整.

mkdir -p /etc/systemd/system/docker.service.d/
vim /etc/systemd/system/docker.service.d/docker.conf
systemctl daemon-reload
systemctl restart docker

export DOCKER_HOST=tcp://127.0.0.1:2375

最後一行在 centos 7.0 的作法又不太一樣, 編輯  /etc/sysconfig/docker-network 
DOCKER_NETWORK_OPTIONS="-H tcp://127.0.0.1:2375 --dns 168.95.1.1"


docker-compose 的部份
yum install epel-release
yum install -y python-pip
pip install docker-compose
pip install docker-compose --force --upgrade

Container 的使用

一般來說, 初學者最常遇到的問題是,  怎麼尋找需要的 image , 以及如何設定 container 的參數. 有時候即使是設定很常見或很熟悉的軟體, 因為是透過 docker 使用, 也會遇到不少問題.

透過指令會列出符合名稱的 image , 例如
docker search postgresql
就會列出 postgresql 相關的 image, 以及一些相關的資訊, 例如是否官方提供的 (officical) , 目前得到好評數 ( Stars)
我個人的經驗是, official 不一定好用, 看 stars 可能較有參考性.

至於設定 container 的參數, 原則上當然是先找該 image 的官方文件.
其次是透過 docker exec 的方式進到 container 內查看 log 或系統情況來找問題.
最後就是修改該 image 的 dockerfile 重新製作 debug 用的 image 來找問題.
或者換一個 image 也可能是比較快的解決方案.


沒有留言: