Docker 是一個基於 Go 語言的開源應用容器引擎,它既能實現虛擬化,又可用於將應用服務打包成輕量、可移植的容器,從而能夠發佈到任何 Linux 平臺。除了優秀了沙箱機制外,Docker 容器的開銷也極低。
正如其名,Docker 所作的事情正是以一個集裝箱的身份承載應用服務的運行,它與傳統的 KVM、Xen 等基於硬件虛擬化的雲計算系統不一樣,而是採用了 LXC (Linux Container) 內核虛擬化的模式,使得應用服務再也不須要獨立的貨輪(OS)爲其提供運做環境,而是裝載到集裝箱(Container)中運行服務。java
不少發行版的軟件倉庫裏已經爲您準備好了 Docker 相關的包——但或許您更喜歡使用最新的 Docker 版本,在這種狀況下,您能夠參照 Docker 官方的安裝文檔。官方提供了 CentOS、Debian、Fedora 和 Ubuntu 的安裝源和安裝說明,同時也提供了從二進制文件配置安裝的方法。參照官方文檔的流程安裝,一般不會出錯。linux
這裏給出 Debian 9 - Stretch 安裝 Docker 的示例。docker
sudo apt purge docker docker-engine docker.io containerd runc
# 刷新數據庫 sudo apt update # 一些必要的前置 sudo apt install apt-transport-https ca-certificates \ curl gnupg2 software-properties-common # 添加 Docker 官方 GPG key curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - # 以末8位字符查找其 fingerprint,應與文檔頁面所列一致 sudo apt-key fingerprint 0EBFCD88 # 添加軟件源,注意機器架構 arch = amd64/armhf/arm64 sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/debian \ $(lsb_release -cs) stable" # 刷新數據庫並安裝 Docker sudo apt update && sudo apt install docker-ce docker-ce-cli containerd.io # 啓動 docker 服務 sudo systemctl enable docker sudo systemctl start docker # 驗證安裝 sudo docker run hello-world
root
權限就可以操做 Docker,咱們還須要繼續如下操做:# 首先查看當前系統是否有 docker 組 grep docker /etc/group # 若沒有,則創建 docker 組 sudo groupadd -g 233 docker # 將用戶加入到 docker 組 # username 爲用戶名,可用 $USER 變量表示當前用戶 sudo gpasswd -a username docker # 或新建一個用戶 sudo useradd -G docker -u 2333 newuser # 重啓 docker 服務 sudo systemctl restart docker # 從新登陸並驗證權限 <必定要從新登陸> docker info
sudo
操做 Docker 了。要運行一個容器服務,咱們須要爲其準備一個鏡像。這裏咱們以 Docker Hub 上的一個公共鏡像:Alpine 爲例,介紹容器建立和管理的相關命令。shell
# 搜索鏡像 docker search alpine # 從列表中選取鏡像並拉取:<鏡像名:標籤>。其中標籤可忽略,默認 latest docker pull alpine # 或 alpine:latest # 等待拉取完成,查看已有鏡像列表 docker images # 或 docker image ls # 查看鏡像具體信息 <端口、掛載點等> docker inspect alpine # 新建容器並以交互模式 <-it> 運行 [/bin/ash] 命令 # ash 爲 alpine 的默認 shell docker run -it [--name test] [-v /tmp/test:/root] [-p 8080:80] alpine [/bin/ash] # 也可讓容器建立後在後臺以掛起模式 <-d> 運行 docker run -d --name background alpine # 鏈接到一個已啓動的容器並執行命令 docker exec -it test /bin/ash # 以交互模式從 test 容器運行終端 # 中止、啓動或重啓容器 docker stop/start/restart test # 刪除容器 docker rm [-f] test
若是咱們要運行本身的應用服務,則須要本身構建合適的鏡像。雖然從一個基礎鏡像構建容器並在容器內部操做也能實現應用服務的部署,甚至在此基礎上還能夠將容器打包爲新的鏡像,但這樣作並不合適,其自己違背了 Docker 的初衷。Docker 鏡像應當被設計爲一個即插即用的模板,使得咱們只須要少許的配置就能輕鬆部署大規模的應用服務。故爲特定的應用服務構建合適的鏡像是必不可少的。數據庫
爲了構建一個鏡像,咱們須要先準備一個空目錄,並在其中新建一個 Dockerfile
文件。此目錄用來存放鏡像須要的全部資源,在構建操做中,整個目錄都會被提交到 Docker Daemon 上,所以目錄中不該包含無用的資源。若是存在大量零碎的文件,將之打包成 tar
檔案是推薦的作法。安全
Dockerfile
用於指定如何構建鏡像,一個 Dockerfile
一般包含這些內容:網絡
# 指定基礎鏡像 FROM alpine # 鏡像維護者信息 MAINTAINER Lost-Melody xxx@xxx.com # 環境變量 ENV HOME /root # 向鏡像中添加文件目錄,tar 包會自動解壓 ADD dir.tar.gz /root/dir # 向鏡像中添加文件,與 ADD 區別在於不會解壓 tar 包 COPY files/* /root/ # 指定工做目錄 WORKDIR /root/dir # 指定運行用戶 USER root # 構建時執行的命令,每一個 RUN 命令都會提交一次新的鏡像 # 兩種方式:exec 方式、shell 方式 RUN ["/bin/sed", "-i", "s/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g"] RUN apk update && apk upgrade \ && apk add tzdata \ && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && apk add openjdk8 # 指定容器啓動命令,可被 docker run 指定的命令覆蓋。多條 CMD 只有最後一條生效 CMD echo "Hello, world!" CMD ["/bin/ash"] # 指定容器入口命令,不被 run 覆蓋。多條只有最後一條生效 ENTRYPOINT ["/usr/bin/java", "-version"] ENTRYPOINT java -jar xxx.jar # 暴露容器端口以供主機映射 EXPOSE 80 # 添加掛載點 VOLUME ["/root/dir"] # 當以此鏡像爲基礎鏡像時執行命令 ONBUILD ADD dir2.tar.gz /root/dir ONBUILD RUN rm -rf /root/dir
編寫好 Dockerfile
文件後,在該目錄中執行 docker build -t name .
構建鏡像。架構