docker學習筆記(不定時更新)

docker學習筆記

標籤(空格分隔): docker


官方安裝教程:https://docs.docker.com/install/
官方文檔:https://docs.docker.com/get-started/
國內鏡像:https://www.docker-cn.com/registry-mirror
一篇很好的入門教程:https://www.jianshu.com/p/cf6e7248b6c7?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

1. 安裝

官方安裝教程:https://docs.docker.com/install/

1.1 windown

  • windown7安裝Docker Toolbox。安裝過程中需要翻牆,不能翻牆時可以把 C:\Program Files\Docker Toolbox文件夾下的boot2docker.iso複製到C:\Users\lzy.docker\machine\cache下,然後斷開網絡,就可以繼續安裝完畢了,親測可行!
    • docker Toolbox設置國內鏡像方法https://www.cnblogs.com/loveyouyou616/p/6702696.html
  • window10專業版 需要啓動Hyper-V功能,然後安裝Docker Desktop for Windows

1.2 linux

2. 命令

docker images

docker ps

docker info //查看當前環境

docker port [container_id] //查看容器端口映射

docker start|stop|restart [container_id]

docker save 鏡像ID -o 文件 // 將指定的鏡像打包(例:docker save ef6a7c98d192 -o /home/wuyongfei/springboot-demo.tar)

docker login -u username -p password //登錄鏡像倉庫

docker pull hub.docker.com/zlxtk/nginx:latest //拉取鏡像 [域名]/[用戶名]/容器名[:版本號]

docker run -i -t ubuntu /bin/bash
# -i : 啓動一個可交互的容器
# -t : 表示使用pseudo-TTY,關聯到容器的stdin和stdout
# ubuntu : 表示要允許的容器
# /bin/bash : 啓動容器時要允許的命令

# 如果在交互式容器中執行exit命令,整個容器會停止允許。如果需要退出交互且不影響容器允許,可以通過【ctrl+PQ】進行

docker logs [container_id] //查看容器日誌
# [container_id]爲容器id,是容器啓動時生成的,輸入命令時只需要輸入前3位或前4位就可以,只要能與其他容器區分開

docker kill [container_id] //殺死容器進程

docker run -d -p 80:80 nginx
# -d : 後臺允許
# -p : 指定主機和容器的端口映射

docker exec -it [container_id] /bin/bash // 進入容器
# docker exec 命令可以在指定的容器中允許命令

docker commit [container_id] my-nginx //把容器轉爲鏡像,這樣my-nginx中就包含了之前的改動,可以通過docker run直接運行

docker search nginx //搜索鏡像

# 提交鏡像分爲兩部,先設置tag,再push
docker tag [域名]/[用戶名]/容器名[:版本號]

docker push 容器名

docker rmi nginx //刪除鏡像

docker history [container_id] //查看鏡像層信息
docker inspect [container_id] //查看鏡像信息

2.1 docker run 詳解

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
-d : 即(detached)後臺允許,不加就是前臺允許
--name : 用容器名指定容器,多用於兩個容器間建立link通信
--rm : 容器退出時自動刪除容器
--pid=host : 共享主機的pid namespace
--uts="" : UTS可以使容器用主機使用相同的hostname和domain,使用要慎重
--ipc="" : 進程間通信的支持,可以和主機共享
--dns=[]
--net="bridge" : 網絡模式,5種,默認bridge.
    none:不適用網絡
    bridge:默認,通過veth連接到主機的橋接上
    host:適用主機相同的網絡
    container:<name|id>:使用其他容器的網絡
    network:使用用戶自定義網絡(通過docker network create 創建)
--mac-address="" : 設置mac
--net-alias=[]
--ip=""
--ip6=""
--add-host : 在容器中添加ip到host的解析,即設置/etc/hosts文件

--restart : 啓動策略
    No:默認,無任何重啓操作
    On-failure:當容器的命令返回非0值,即有錯時,進行重啓
    Always:無論容器處於什麼狀態,都重啓。同時,容器會在daemon啓動時,附帶自啓動
    Unless-stopped:與Always類似,但不會隨daemon自啓動

CGroups :控制容器資源使用情況,內存、CPU、I/O等,詳情見:https://docs.docker.com/engine/reference/run/#specifying-custom-cgroups

# 容器默認在非特權模式下,不能訪問任何宿主機的設備。如果需要訪問某些設備,就必須使用--privileged參數。如果希望使用某個特定的設備,則使用--device。如使用GPU:
docker run --device=/dev/snd:/dev/snd.. 

--log-driver : 日誌驅動
    none:不顯示日誌
    json-file:默認,通過json保存日誌
    syslog:將日誌輸出到系統日誌中,通常在/var/log/message
    gelf:Graylog Extended Log Format(GELF)日誌,日誌會寫入到GELF的收集器中,如Graylog或Logstash
    journald:寫入到journald
    fluentd:寫入到fluentd
    awslogs:寫入Amazon CloudWatch
    splunk:寫入到splunk日誌收集器中

-v :設置數據卷
    例子:docker run -d -P --name datatest -v /webapp ubuntu //該命令創建了一個名爲datatest的容器,同時爲其創建了一個/webapp的數據卷,這是數據卷在容器內部的位置,它在主機上的位置可以通過 docker inspect [container_id] 命令查看,是查詢結果中的【Mounts】部分,通常在/var/lib/docker下

-v src:des //將主機的src目錄映射到容器的des目錄,這時就可以在容器中修改主機src目錄,這種操作很危險,一定不要把主機根目錄映射如容器。    

--volumes-from name //使用name容器的數據卷
    
-e //設置環境變量

2.2 容器網絡

docker安裝成功後,會自動創建三種網絡,可以通過命令:
docker network ls
查看

docker network inspect <net> //查看容器網絡詳情,<net>爲 docker network ls查詢出來的網絡NAME

#每運行一個容器,都會在全局註冊相關的網絡信息

#用戶可以自定義網絡,主要包括三種:橋接網絡、Overlay網絡、插件網絡。

# 橋接網絡
系統默認的橋接是docker0
將多個容器隔離在一個新的橋接網絡中:
docker network create --driver bridge mynet
docker network inspect mynet
    # 然後可以通過--net屬性將容器掛接到mynet中
docker run --net=mynet --rm -it ubuntu
docker network inspect mynet
# 同一個橋接下,形成一個私網,相互間是可以通信的,但這僅限於在同一臺主機上。若要跨主機通信,必須使用Overlay網絡。

# Overlay網絡

3. Dockerfile

# 1. 創建文件夾,並新建Dockerfile
mkdir myimage
cd myimage
vim Dockerfile

FROM ubuntu:14.04
ADD http://mirrors.163.com/.help/sources.list.trusty /etc/apt/sources.list
COPY install.sh /usr/local/src/install.sh
COPY supervisord.conf /usr/local/src/supervisord.conf
 
RUN apt-get  update && \
    apt-get -y install build-essential && \
    apt-get -y install supervisor && \
    cp /usr/local/src/supervisord.conf /etc/supervisor/supervisord.conf && \
    apt-get -y install openssh-server && \
    apt-get -y install git && \
    apt-get -y install vim && \
    apt-get -y install lrzsz && \
    apt-get -y install libxml2-dev && \
    apt-get -y install  pkg-config libssl-dev libsslcommon2-dev && \
    apt-get -y install libbz2-dev && \
    apt-get -y install libcurl4-gnutls-dev && \
    apt-get -y install libjpeg8-dev && \
    apt-get -y install libpng-dev && \
    apt-get -y install libfreetype6-dev && \
    apt-get -y install libmcrypt-dev && \
    apt-get -y install libxslt-dev && \
    apt-get -y install libgmp-dev && \
    apt-get -y install libreadline-dev && \
    ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.h && \
    bash /usr/local/src/install.sh && \
    adduser --gecos '' --disabled-password chenjiayao && \ 
    echo -e '1111\n1111' | passwd chenjiayao && \
    echo -e '11\n11' | passwd root
 
CMD supervisord -n



# 爲什麼要在一個RUN裏面安裝全部軟件.這裏就要說明一點 : 每執行一個Dockerfile的指令都會讓我們的image增加一層只讀層.所以,寫很多指令的話,我們的image就會有太多的layer.所以儘量要剋制命令的個數.

# CMD命令.這裏我沒有使用默認的bash作爲啓動命令是因爲:如果使用bash作爲默認的啓動進程之後,當前container就只會有一個進程bash.那麼其他的apache.ssh等服務都不會自動啓動.*每次運行container都得手動啓動這些服務很麻煩.所以這裏使用supervisor來管理.配置好supervisor之後,只要啓動了supervisor,supervisor就會自動幫我們啓動其他進程.比如apache.ssh等等.這樣就比較方便.


# 2. build
docker build -t image_name .

# 不要以爲最後一個參數是指定Dockerfile所在的目錄.這個目錄指定的是當前docker編譯這個image的工作目錄.

要先明白,docker是一個C/S的軟件,我們使用powerShell輸入命令 .之後命令是被髮送到服務端執行,然後返回結果的.這跟MySQL一樣.只是我們把客戶端和服務端安裝在一臺主機上.
當我們構建image的時候,執行類似COPY指令,那麼把文件拷貝到image中,但是構建文件是在服務端完成的,如何讓docker服務端得到拷貝的文件?這裏我們就要指定一個docker構建的工作目錄了.當構建開始的時候,docker會把工作目錄下的所有文件都發送到服務端.然後開始構建.這樣子他就可以得到我們要copy到image的文件了.
所以我們構建的時候指定.是想把當前目錄下的文件等發送到docker服務端進行構建.只是在上面,我們的Dockerfile正好是放在了docker構建image的工作目錄中了.
那麼,既然上面的參數不是指定Dockerfile所在的目錄.那如果我的機子上有多個Dockerfile的話,那麼docker會使用哪個?我編寫這個Dockerfile的目的就是希望使用這個Dockerfile.這個不用擔心. 如果你在build的時候沒有指定使用哪個Dockerfile.默認會使用構建iamge的工作目錄下名字爲Dockerfile的那個Dockerfile…聽着有點暈…如果不想理清楚這些問題.每次構建的時候使用powerShell進入Dockerfile所在的目錄下,然後執行docker build image_name .就可以了.

docker的container就是爲了某個進程而存在的,這個進程就是CMD所指定的程序.比如:CMD /bin/bash就是啓動了bash.當我們退出了bash之後,整個container也就退出了.如果你的CMD寫成:CMD service nginx start.你會發現container執行之後就馬上結束了.這是因爲整個container只是爲了service nginx start這條命令而存在的,它不會管你這條命令啓動了什麼.默認啓動的bash正好是一直在前臺運行,只有你使用exit命令退出bash的時候才結束bash進程.這個時候container才結束.纔會讓人有container跟虛擬機差不多的錯覺.

dockerfile 指令表

FROM //設置鏡像基礎,可以有多條,兩條FORM指令之間的內容放到一個容器中。
MAINTAINER //設置作者
RUN //編譯鏡像是允許的腳本,每一條就多一層,所以儘量只寫一條
CMD //設置容器啓動命令,只能有一條
LABEL //標籤
EXPOSE //設置容器暴露的端口
ENV //設置容器環境變量,儘量只寫一條,如: ENV NAME=ghosts COUNTRY=China CITY="He Nan"。其他命令中可以用${NAME}讀取環境變量
ADD //編譯鏡像時賦值文件到鏡像中。功能比COPY強大,可以下載遠程文件。源文件必須在編譯目錄中,不能用../
COPY //編譯鏡像時賦值文件到鏡像中.源文件必須在編譯目錄中,不能用../
ENTRYPOINT //設置容器的入口程序,如果有多條只有最後一條生效。
VOLUME //設置容器的掛載卷,儘量寫在最後,命令之後修改掛載目錄中的文件,會被忽略
USER //設置執行RUN、CMD、ENTRYPOINT的用戶名
WORKDIR //設置RUN、CMD、ENTRYPOINT、COPY、ADD指令的工作目錄。如果目錄不存在,會自動創建。
ARG //設置編譯鏡像時加入的參數
ONBUILD //設置鏡像的ONBUILD指令。子鏡像會先執行父鏡像的ONBUILD指令。
STOPSIGNAL //設置容器的退出信號量

docker build

docker build [OPTIONS] PATH|URL|-
# PATH是編譯鏡像的工作目錄,Docker Daemon在編譯開始時,掃描PATH中的所有文件。切忌使用系統根目錄。可以在目錄中添加.dockerignore文件,來過濾不需要的文件。

# -f //默認docker會在讀取PATH或GIT中的Dockerfile文件,-f可以指定其他路徑的文件

# -t //設置鏡像標籤

# --no-cache //不使用緩存

4. 搭建開發環境

官方推薦的搭建java開發環境教程:https://github.com/docker/labs/tree/master/developer-tools/java/
搭建開發環境的一個例子,還有一些概念的說明:http://dockone.io/article/1714
又一個例子:https://blog.csdn.net/jctian000/article/details/82702166

5. 搭建私有倉庫

docker-registry

6. 搭建服務器

6.1 nginx

docker run --name nginx 
    -v D:\libs\docker\nginx\nginx.conf:/etc/nginx/nginx.conf:ro 
    -v D:\libs\docker\nginx\vhosts:/etc/nginx/vhosts
    -v D:\libs\docker\nginx\html:/usr/share/nginx/html
    -p 80:80
    -p 8088:8088
    -d hub.c.163.com/library/nginx:latest
    
docker run --name nginx -v D:\libs\docker\nginx\nginx.conf:/etc/nginx/nginx.conf:ro -v D:\libs\docker\nginx\vhosts:/etc/nginx/vhosts -v D:\libs\docker\nginx\html:/usr/share/nginx/html -p 80:80 -p 8088:8088 -d hub.c.163.com/library/nginx:latest
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章