Docker平常使用及問題

docker安裝

# Docker requires a 64-bit installation regardless of your CentOS version. Also, your kernel must be 3.10 at minimum, which CentOS 7 runs.
# Centos 6安裝docker 連接:「www.centoscn.com/image-text/install/2014/1128/4202.html」
sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

yum install docker-engine
service docker start

docker使用

# 搜索查看可使用的鏡像
docker search centos
# 拉取須要的鏡像
docker pull centos:latest
# 查看本地鏡像列表
docker images
# 查看網絡狀態
docker network ls
# 查看容器信息
docker inspect webhack

# 拷貝一個現存容器中的文件到本地
docker cp aaa39fe1e7af:/etc/redis.conf ./
# 查看一個容器的運行日誌
docker logs -f 容器名orID
# 查看一個容器的root密碼, 由於Docker容器啓動時的root用戶的密碼是隨機分配的。因此,經過這種方式就能夠獲得redmine容器的root用戶的密碼了。(沒測試成功)
docker logs <容器名orID> 2>&1 | grep '^User: ' | tail -n1

# 批量刪除構建失敗的容器
# 先中止容器運行再刪除,不然會掛掉...
docker ps -a  | awk '{print $1}' | xargs docker stop
docker ps -a  | awk '{print $1}' | xargs docker rm
# 而後刪除無用的鏡像文件
docker rmi image_id

# 存出構建好的鏡像文件
docker save -o honey.tar honey:v1
# 載入現有鏡像到docker
docker load --input honey.tar
docker < honey.tar.gz
# 導出容器
docker export id > honey.tar
# 導入容器
cat honey.tar | docker import - honey:latest

# 啓動一個容器的bash終端
docker run -a stdin -a stdout -t centos:6.6 /bin/bash
# 基於centos7的容器沒有/bin/bash命令。。。。很亂

# 基於Dockerfile構建一個鏡像文件
docker build -t honey:v1 .

# 掛載本地文件或目錄到容器中,容器中對文件的修改和宿主機中對文件的修改都會同步到容器和宿主機中,最好的方式是掛載映射目錄,由於編輯文件時可能會形成文件 inode 的改變,從 Docker 1.1 .0起,這會致使報錯誤信息。
# 參見:https://yeasy.gitbooks.io/docker_practice/content/data_management/volume.html
# 掛載文件時,可能會出現本地文件權限是root或者是權限比較大的文件目錄,而掛載到容器中後,容器中的低權限或其餘用戶將沒法對文件目錄進行修改,解決方法是將本地的文件目錄設置爲777權限
docker run --net=host -v /home/docker/snmp/conf/supervisord.conf:/etc/supervisord.conf -v /home/docker/snmp/log:/home/log -it snmp:v3 supervisord

# 把容器放到後臺運行並打印出容器的id
docker run -d

# 退出容器後即刪除容器,不能與-d共用
docker run --rm -it 容器ID

# 提交修改後的容器爲新的鏡像
docker commit 容器ID 鏡像ID

# Docker 掛載數據卷的默認權限是讀寫,用戶也能夠經過 :ro 指定爲只讀。
docker run -d -P --name web -v /src/webapp:/opt/webapp:ro

docker export 和 docker save的區別

# export用於持久化容器(不是鏡像),會丟失歷史和元數據,沒法回滾到之前的層
docker ps -a
docker export 容器ID > export.tar
# 導入
cat export.tar | docker import - export:v1

# save用於持久化鏡像(不是容器),有歷史全部的操做,能夠會滾
docker save 鏡像ID > image.tar
# 導入
docker load < image.tar

Dockerfile使用過程當中的一些問題

# WORKDIR  指構建容器時容器內部的目錄
WORKDIR /home
# COPY  複製本地文件到服務器的目錄,沒法複製操做容器內的文件
COPY soft/jdk-7u79-linux-x64.rpm /home
# RUN   運行服務器中的命令
RUN rpm -ivh jdk-7u79-linux-x64.rpm
# 切換目錄
WORKDIR redis-3.2.0
WORKDIR src/
# 此時的目錄爲/home/redis-3.2.0/src
RUN pwd
# 容器內部的複製命令,沒法操做本地文件
RUN cp redis-cli /usr/bin
# 默認調用的是sh -c apt-get install 某些狀況下易出現問題
CMD apt-get install
# 所見即所得,按照本身想要的方式執行 調用exec from
CMD ["apt-get install"]

# 指定容器運行時的用戶名或UID,後續的RUN也會使用指定的用戶執行命令
# 雖然使用nobody權限的用戶啓動容器執行命令比較安全,可是對於yum這種則沒法執行
# 解決方法是使用supervisord啓動執行的程序的時候指定啓動的用戶權限組進行執行啓動
USER nobody

# 建立一個能夠從本地或者其餘容器掛載的掛載點,若是服務器不存在就自動建立
# 和-v建立卷的區別https://segmentfault.com/q/1010000004107293
VOLUME ["/data"]

CMD RUN的區別

CMD 容器啓動時執行的命令,可被docker run中的命令重寫覆蓋,每一個Dockerfile僅最後一條CMD指令生效
RUN 容器構建時運行的命令
ENTRYPOINT,表示鏡像在初始化時須要執行的命令,不可被docker run中的命令重寫覆蓋,需謹記

# ENTRYPOINT/CMD都只能在文件中存在一次,而且最後一個生效 多個存在,只有最後一個生效,其它無效!
須要初始化運行多個命令,彼此之間可使用 && 隔開,但最後一個需要爲無限運行的命令,需切記!
# ENTRYPOINT/CMD,通常二者能夠配合使用,好比:
ENTRYPOINT ["/usr/sbin/sshd"]
CMD ["-D"]

# 在Docker daemon模式下,不管你是使用ENTRYPOINT,仍是CMD,最後的命令,必定要是當前進程須要一直運行的,纔可以防容器退出。
# 如下無效方式:
ENTRYPOINT service tomcat7 start #運行幾秒鐘以後,容器就會退出
 CMD service tomcat7 start #運行幾秒鐘以後,容器就會退出

# 這樣有效:
ENTRYPOINT service tomcat7 start && tail -f /var/lib/tomcat7/logs/catalina.out
# 或者
CMD service tomcat7 start && tail -f /var/lib/tomcat7/logs/catalina.out

# 這樣也有效:
ENTRYPOINT ["/usr/sbin/sshd"]
 CMD ["-D"]

錯誤解決

# 報錯「tar (child): Error is not recoverable: exiting now」這類錯誤的時候
# 注意檢查是否指定了WORKDIR

Docker相關資源

經常使用docker命令,及一些坑:http://blog.csdn.net/wsscy2004/article/details/25878363
Docker使用Dockerfile構建鏡像 :http://my.oschina.net/u/1861837/blog/649015
Docker學習總結之Run命令介紹:http://www.cnblogs.com/vikings-blog/p/4238062.html
Docker學習筆記之二,基於Dockerfile搭建JAVA Tomcat運行環境:http://www.blogjava.net/yongboy/archive/2013/12/16/407643.html
Dockerfile reference:https://docs.docker.com/engine/reference/builder/
Docker — 從入門到實踐(很是不錯):https://yeasy.gitbooks.io/docker_practice/content/

後期更新問題

後期持續性的更新確實是個頭疼的問題,不知道有沒有相似github pages那種同步的功能會不會出現...
相關文章
相關標籤/搜索