Docker 是一個開源的應用容器引擎,基於Go開發。Docker 可讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,不單單能夠發佈到任何流行的 Linux 機器上,也能夠在Windows和MAC上安裝,也能夠實現虛擬化。容器是徹底使用沙箱機制。 Docker 從 17.03(2017.03月) 版本以後分爲 CE(Community Edition: 社區版) 和 EE(Enterprise Edition: 企業版)linux
1.17.0.3 版本之後變動版本發佈策略,每一個季度會發一個stable版本,每個月會發edge版本,社區版本從發版本後維護四個月就會中止對版本的維護。docker
Docker引擎是一個c/s結構的應用 Server(docker daemon):常駐進程 REST API:實現了client和server間的交互協議 CLI:實現容器和鏡像的管理,爲用戶提供統一的操做頁面。shell
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
第一步 刪除舊的版本
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
複製代碼
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)
複製代碼
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」覆蓋了。
字面意思是進入點,而它的功能也恰如其意。
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裏的內容。
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
複製代碼
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命令以後
複製代碼
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> #鏈接網絡,實現一個容器鏈接多個網絡
複製代碼