docker能夠說給咱們的部署帶來極大的方便和可逢凶化吉性!(懂的同窗天然懂)html
在初步瞭解以後,咱們就能簡單使用docker了。java
剛開始玩docker時,能夠基於系統級別的鏡像作定製,好比基於 centos 鏡像使用docker;nginx
docker pull centos:7 # 把鏡像拉下來 docker run -it centos:7 # 建立一個容器便可運行
你能夠在拉下來的容器裏安裝任何須要的應用(必要的);而後,一切都看起來很美好!web
可是,這時,咱們最擔憂一個問題,那就是docker掛了怎麼辦?機器重啓後怎麼辦?docker
是的,這個擔憂是有道理的,若是你沒有去查細細看過官方文檔,那麼多半你是吃過這虧,纔會清楚其中的坑!apache
因此,咱們來提幾個問題? 簡單而不簡約!vim
1. 使用commit 命令保存到本地centos
docker commit -m "msg" abcommitid myimage:1.0
其好處是操做方便,本機永久保存,方便下次快速操做。壞處,也不算,就是你若是想放到遠程,你必須註冊一個docker hub 帳號,而後保存過去。並且這樣的鏡像,通常只適合本身使用,不適合團隊傳播!(不過也不是絕對的)api
2. 使用docker save 保存壓縮包到本地bash
docker save -o myimage_save.tar abcontainerid
這樣備份好以後,就能夠將改該容器處處分發到其餘機器或者作備份了。這樣作都好處是,傳播方便,不會致使隱私泄露。壞處是都是本地包,沒有存儲在雲端,必須處處攜帶該包。
導入時使用 docker load 便可!
docker load -i myimage_save.tar
而後就能夠看到鏡像了,使用docker run 運行。操做步驟稍微繁瑣了點。注意: 只有 docker run 才能自定義各類參數哦。(docker run 聚合了 create 和 start 的功能)
在部署應用時可能存在須要將新應用部署好後,再刪除原容器的操做,因此容器重命名就頗有必要的, 使用 docker rename
docker rename 原容器名 新容器名
3. 使用 docker export 保存到本地, 操做如同 docker save, 可是功能受限,我的不是很喜歡使用
docker export -o mycontainer_save.tar tmp_container
應用場景能夠說是剛需: 我把第一個鏡像安裝好後,但願下次建立容器以後就能自動運行,而不是還要操做N多繁雜步驟,從而下降移植性帶來的方便性!
1. 能想得最簡單的是,使用系統的開機啓動功能
好比在 /etc/rc.d/rc.local 中添加相應的啓動,可是這裏有個前提,那就是你必須先把容器啓起來; (啓不啓得來另說)
2. 使用docker的開機自動運行功能,使用簡單;
這裏說的簡單是指使用,而在操做的時候則看我的了。在docker建立時,使用啓動腳本,自動運行。主要的命令有: CMD, RUN, ADD . 建立一個start.sh,能夠定複雜的啓動邏輯;可是這在後期中,就很難更改其邏輯了哦!
CMD ["sh", "-c", "service httpd start;bash"] # 開機啓動 apache 服務
Docker 自帶了端口映射功能,使用docker run -p 進行操做!
docker run -d -p 81:80 --name container_name myimage:1.0
多個端口映射使用多個-p便可;
自定義host也頗有用,好比我想看我當前氣息環境,hostname就頗有用,還有hostname的固定能夠不致讓本身迷失; 只須要使用-h參數就能夠了。
docker run -d -h myapi1 myimage:1.0
這種應用場景是,好比你其餘應用的服務,爲了防止ip常常變動致使的麻煩性,這種服務通常是之內網域名形式出現,因此須要加入域名解析。
方法一是,你給每一個容器定義一個通用的域名解析器dns;
方法二是,爲各自的hosts里加入解析。而這在docker中,則操做是不會被保存的,每一個新容器總是新 hosts. 能夠經過 --add-host 添加自定義hosts解析:
docker run --add-host a.com:1.2.3.4 myimage:1.0
這種方式僅用於學習,其中更有用的是加入一個dns; 其操做步驟就是安裝個bind 軟件,而後配製 named.conf 便可。使用時,vim /etc/resolv.conf
nameserver 100.1.1.1
其實如上的配置基本能知足大部分狀況下的生產需求了。可是不免仍是個性的,好比我想定義nginx訪問某個的另外端口,這時使用dns 就很差搞了。在不改變外部環境的狀況下,咱們只能自定義修改了。最直接的方式是在 nginx 中直接改掉便可。可是這樣作還有個,若是我想讓同一個容器靈活地指向任意端口怎麼辦?那就只能自定義變量操做了,在建立容器的時候指定該端口便可。
這樣的自定義變量能夠用於設置 nginx 的自定義端口, java 堆大小,日誌目錄設置等等.
具體作法步驟以下:
# 1. docker run -it myimage:1.0, 修改 nginx 配置文件,使其能夠方便被替換,以下 # vim /usr/local/nginx/conf/conf.d/www.conf server { listen 80; server_name localhost; access_log /var/log/nginx/host.access.log main; location / { root /www/webapp/html/app1; try_files $uri $uri/ /index.html; index index.html index.htm; } location /api { # 設置點位符使外部可替換 set $API_HOST 192.168.1.1; set $API_PORT 8083; proxy_pass http://$API_HOST:$API_PORT; index index.html index.htm; } } # 2. 本身嘗試啓動無誤後,將新變動提交到原鏡像, docker commit docker commit -m 'conf update' abcommitid myimage:1.0 # 3. vim Dockerfile, 設置啓動腳本 FROM myimage:1.0 MAINTAINER xxx <abc@abc.com> ENV NGINX_CONFD_PATH /usr/local/nginx/conf/conf.d ENV PATH /usr/local/nginx/sbin:$PATH ADD ./start.sh /usr/local/bin/start.sh RUN chmod +x /usr/local/bin/start.sh EXPOSE 80 # 設置啓動腳本,腳原本源本機,可隨時修改 CMD [ "/usr/local/bin/start.sh" ] # 4. 縮寫啓動腳本,使在啓動時執行動態配置變動 awk # vim start.sh #!/bin/bash # override port variable if set if [ ! -z "$API_PORT" ]; then echo "------- api port replacing to $API_PORT -----------"; awk -v PORT="set \$API_PORT $API_PORT;" '{ sub(/set.*\$API_PORT.*/, PORT); print; }' ${NGINX_CONFD_PATH}/default.conf \ > ${NGINX_CONFD_PATH}/default.conf.new && mv ${NGINX_CONFD_PATH}/default.conf.new ${NGINX_CONFD_PATH}/default.conf fi if [ ! -z "$API_HOST" ]; then echo "------- api host replacing to $API_HOST -----------"; awk -v HOST="set \$API_HOST $API_HOST;" '{ sub(/set.*\$API_HOST.*/, HOST); print; }' ${NGINX_CONFD_PATH}/default.conf \ > ${NGINX_CONFD_PATH}/default.conf.new && mv ${NGINX_CONFD_PATH}/default.conf.new ${NGINX_CONFD_PATH}/default.conf fi # start nginx /bin/sh -c 'nginx -g "daemon off;" ' # 5. 都操做好後,從新構建一個新的鏡像,使用就能夠了 docker build -t myimage:1.1 . # 6. 使用時,用 --env 來指定自定義變量 docker run --env API_HOST=192.168.1.112 --env API_PORT=8090 -it myimage:1.1 # 此時,進入查看時,nginx已經運行在不一樣的api端口下了
注意: 本處使用的是比較原始的 docker 版本,若是使用到 docker-compose 等高級工具,可能就不須要這麼麻煩了!
這樣的場景是比較多的:
好比爲了統一管理安裝包,不讓全部安裝包散亂在各個容器的各個目錄;
好比爲了讓容器的數據存儲使用一塊新買的磁盤;
好比我想複製同一份代碼到新容器使用,從而方便後續獨立修改;
好比你沒法進入你的容器,卻想拿到其中的數據等等;
因此,咱們須要使用到目錄映射功能,這是 docker 自帶的功能,方便實用: -v 參數設置便可:
docker run -d -v /opt/docker/webapps:/www/webapp myimage:1.0
通過上面這些問答,相信你已經能簡單應付經常使用運維場景了,盡情享受docker帶來的可移植性方便以及其隔離性吧。