Docker 基礎

Docker 是一個開源的應用容器引擎,基於Go開發。Docker 可讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,不單單能夠發佈到任何流行的 Linux 機器上,也能夠在Windows和MAC上安裝,也能夠實現虛擬化。容器是徹底使用沙箱機制。 Docker 從 17.03(2017.03月) 版本以後分爲 CE(Community Edition: 社區版) 和 EE(Enterprise Edition: 企業版)linux

image.png

1.17.0.3 版本之後變動版本發佈策略,每一個季度會發一個stable版本,每個月會發edge版本,社區版本從發版本後維護四個月就會中止對版本的維護。docker

image.png

image.png

image.png Docker引擎是一個c/s結構的應用 Server(docker daemon):常駐進程 REST API:實現了client和server間的交互協議 CLI:實現容器和鏡像的管理,爲用戶提供統一的操做頁面。shell

image.png

containerd:dockerd實際真實調用的仍是containerd的api接口(rpc方式實現),containerd是dockerd和runc之間的一箇中間交流組件json

docker-shim:是一個真實運行的容器的真實墊片載體,每啓動一個容器都會起一個新的shim進程,它直接經過指定的三個參數:容器id,boundle目錄,運行時二進制(默認爲runc)來調用runc的api建立一個容器。ubuntu

runc:是一個命令行工具端,他根據oci(開放容器組織)的標準來建立和運行容器。實現了容器啓停、資源隔離等功能。Docker默認提供了docker-runc實現,事實上,經過containerd的封裝,能夠在Docker Daemon啓動的時候指定runc的實現。windows

image.png

1 安裝部署

第一步 刪除舊的版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine
                  
第二步 配置yum源
安裝yum工具: yum install -y yum-utils 
下載docker-ce yum源: yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

第三步 執行安裝
查看全部版本:yum list docker-ce --showduplicates | sort -r
指定版本安裝: yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

systemctl enable docker
systemctl start docker 

第四步 配置鏡像倉庫
1. Docker安裝完成之後,在/etc/docker/目錄下執行
cat > daemon.json << EOF
{
   "insecure-registries": [「10.180.210.196"]
}
EOF
systemctl restart docker 重啓啓動docker時配置生效

2. 登陸harbor倉庫
   docker login 10.180.210.196 而後根據提示輸入用戶名:admin,密碼:Harbor12345
複製代碼

image.png

2 Docker鏡像製做

FROM: 引用基礎鏡像
            格式:FROM [--platform=<platform>] <image>[:<tag>] [AS <name>] 
            經過公有倉庫或私有倉庫拉取鏡像,platform標識系統架構:linux/amd64, linux/arm64, or windows/amd64。
RUN:執行命令
          兩種格式:RUN <command> (/bin/sh -c on Linux or cmd /S /C on Windows)
                           RUN ["executable", "param1", "param2"] (exec form)
          示例:RUN  mkdir /test \
                              touch /test/hello   #多條命令能夠使用 \換行鏈接
ENV:設置環境變量
          兩種格式:ENV <key> <value>
                           ENV <key1>=<value1> <key2>=<value2> ...
           示例:ENV myName John 
                     ENV myCat fluffy       或者 ENV myName=John  myCat=fluffy 
EXPOSE: 指定容器運行時監聽的端口
            格式:EXPOSE <port> [<port>/<protocol>...] #默認爲tcp協議
            示例:EXPOSE 80/tcp  
                      EXPOSE 80/udp
ADD:將文件從本地或URL中添加到鏡像文件系統,本地文件必須在上下文(Dockerfile)的當前目錄或子目錄。
      格式:ADD [--chown=<user>:<group>] <src>... <dest>
                ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
       示例:ADD test.tar.gz /    #自動解壓
COPY:和ADD指令功能類似,但缺乏兩個功能點(不能從URL中添加文件,不能自動解壓)

CMD:容器啓動命令
        格式:CMD ["executable","param1","param2"] (exec form, this is the preferred form)
                  CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
                  CMD command param1 param2 (shell form)

ENTRYPOINT:容器啓動的入口點
         格式:ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
	    ENTRYPOINT command param1 param2 (shell form)                  
複製代碼

3 CMD指令:

The main purpose of a CMD is to provide defaults for an executing container.centos

CMD在容器運行的時候提供一些命令及參數,用法以下:api

CMD ["executable","param1","param2"] (exec form, this is the preferred form)bash

CMD ["param1","param2"] (as default parameters to ENTRYPOINT)markdown

CMD command param1 param2 (shell form)

第一種用法:運行一個可執行的文件並提供參數。 第二種用法:爲ENTRYPOINT指定參數。 第三種用法(shell form):是以」/bin/sh -c」的方法執行的命令。 如你指定:

CMD [「/bin/echo」, 「this is a echo test 」] build後運行(假設鏡像名爲ec):

docker run ec 就會輸出: this is a echo test

是否是感受很像開機啓動項 docker run命令若是指定了參數會把CMD裏的參數覆蓋: (這裏說明一下,如:docker run -it ubuntu /bin/bash 命令的參數是指/bin/bash 而非 -it ,-it只是docker 的參數,而不是容器的參數,如下所說參數均如此。)

一樣是上面的ec鏡像啓動:

docker run ec /bin/bash

就不會輸出:this is a echo test,由於CMD命令被」/bin/bash」覆蓋了。

4 ENTRYPOINT  

字面意思是進入點,而它的功能也恰如其意。

An ENTRYPOINT allows you to configure a container that will run as an executable.它可讓你的容器功能表現得像一個可執行程序同樣。

容器功能表現得像一個可執行程序同樣,這是什麼意思呢?

直接給個例子好說話:

例子一:

使用下面的ENTRYPOINT構造鏡像:

ENTRYPOINT ["/bin/echo"] 那麼docker build出來的鏡像之後的容器功能就像一個/bin/echo程序:

好比我build出來的鏡像名稱叫imageecho,那麼我能夠這樣用它:

docker run -it imageecho 「this is a test」 這裏就會輸出」this is a test」這串字符,而這個imageecho鏡像對應的容器表現出來的功能就像一個echo程序同樣。 你添加的參數「this is a test」會添加到ENTRYPOINT後面,就成了這樣 /bin/echo 「this is a test」 。如今你應該明白進入點的意思了吧。

例子二:

ENTRYPOINT ["/bin/cat"]

構造出來的鏡像你能夠這樣運行(假設名爲st):

docker run -it st /etc/fstab 這樣至關: /bin/cat /etc/fstab 這個命令的做用。運行以後就輸出/etc/fstab裏的內容。

5 CMD VS ENTRYPOINT

5.1 CMD

FROM centos
CMD["ps","aux"]

docker run centos:CMDtest
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  4.0  0.0  41812  1520 ?        Rs   12:19   0:00 /usr/bin/ps aux

若是改變參數命令爲:-elf
docker run centos:CMDtest -elf
docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"-elf\": executable file not found in $PATH": unknown.

必須CMD徹底覆蓋
docker run centos:CMDtest ps -elf
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 R root         1     0  0  80   0 - 10453 -      12:20 ?        00:00:00 ps -elf
複製代碼

5.2 ENTRYPOINT

FROM centos
ENTRYPOINT ["ps"]
CMD ["aux"]

docker run centos:CMDtest
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  41812  1516 ?        Rs   12:27   0:00 ps aux

若是改變參數命令爲:-elf
docker run centos:CMDtest -elf
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 R root         1     0  1  80   0 - 10453 -      12:28 ?        00:00:00 ps -elf

當指定了ENTRYPOINT後,CMD的含義就發生了改變,再也不是直接的運行其命令,而是將CMD的內容做爲參數傳給ENTRYPOINT指令,換句話說實際執行時,將變爲:
<ENTRYPOINT> "<CMD>"

ENTRYPOINT指定默認的運行命令, CMD指定默認的運行參數
由於ENTRYPOINT和CMD同時存在時, docker會把CMD的命令拼接到ENTRYPOINT命令以後
複製代碼

image.png

image.png

image.png

6 Docker 命令

docker info 能夠查看到docker環境的基本信息
docker ps 查看運行中的容器
   docker ps -l   查看最後一個啓動的容器
   docker ps -a 查看全部狀態的容器
   docker ps -f status=running(exited/dead/restarting)  根據狀態查詢
docker images 查看鏡像
   docker history image_id 查看鏡像的全部層
docker build -t images_name:v1 Dockerfile_dir/.
         docker build -t images_name:v1 -f Dockerfile.centos .
docker exec -it container_id bash   進入容器中
docker logs -f container_id 查看日誌
docker rmi -f image_id 刪除鏡像 
docker rm -f container_id  刪除容器
       docker rm -f $(docker ps -a -f status=exited -q)  批量刪除狀態爲退出的容器
docker run -it  image_name:version  (cmd)  前臺生成容器
       docker run  -d  -P  --name=test1 image (cmd)  後臺生成容器,-P 自動映射端口
docker network ls 查看網絡
docker network create my-net      #建立網絡
docker run -d --name test --network my-net image (cmd)#啓動容器關聯my-net網絡
docker network connect <container-name>  <other-net>   #鏈接網絡,實現一個容器鏈接多個網絡
複製代碼
相關文章
相關標籤/搜索