摘要:容器運行時,會打印一條信息消息并退出。因此,更好地做法是將需要使用的用戶加入用戶組。涉及到了兩條指令,和。執行命令指令是用來執行命令行命令的。
Docker 是個劃時代的開源項目,它徹底釋放了計算虛擬化的威力,極大提高了應用的運行效率,降低了云計算資源供應的成本!使用 Docker,可以讓應用的部署、測試和分發都變得前所未有的高效和輕松!
無論是應用開發者、運維人員、還是其他信息技術從業人員,都有必要認識和掌握 Docker,節約有限的時間。
系統要求要安裝Docker CE,您需要這些Ubuntu版本的64位版本:
Artful 17.10(Docker CE 17.11 Edge及更高版本)
ZESTY 17.04
Xenial 16.04(LTS)
Trusty 14.04(LTS)
Ubuntu x86_64,Linux armhf,s390x(IBM Z)和ppc64le(IBM Power)架構上支持Docker CE 。
卸載舊版本老版本的Docker被稱為docker或docker-engine。如果安裝了這些,請將其卸載:
$ apt-get remove docker docker-engine docker.io使用存儲庫進行安裝
首次在新的主機上安裝Docker CE之前,需要設置Docker存儲庫。之后,您可以從存儲庫安裝和更新Docker。
設置存儲庫
1.更新apt軟件包索引:
$ apt-get update
2.安裝軟件包以允許apt通過HTTPS使用存儲庫:
$ apt-get install apt-transport-https ca-certificates curl software-properties-common
3.添加Docker的官方GPG密鑰:
鑒于國內網絡問題,強烈建議使用國內源,官方源請在注釋中查看。
$ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add - # 官方源 # $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
4.添加 Docker 軟件源
鑒于國內網絡問題,強烈建議使用國內源,官方源請在注釋中查看。
然后,我們需要向 source.list 中添加 Docker 軟件源
$ sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable" # 官方源 # $ sudo add-apt-repository # "deb [arch=amd64] https://download.docker.com/linux/ubuntu # $(lsb_release -cs) # stable"
以上命令會添加穩定版本的 Docker CE APT 鏡像源,如果需要最新或者測試版本的 Docker CE 請將 stable 改為 edge 或者 test。從 Docker 17.06 開始,edge test 版本的 APT 鏡像源也會包含穩定版本的 Docker。
安裝Docker CE1.更新apt軟件包索引。
$ apt-get update
2.安裝最新版本的Docker CE,或者轉到下一步安裝特定版本。任何現有的Docker安裝都將被替換。
$ apt-get install docker-ce
3.在生產系統上,您應該安裝特定版本的Docker CE,而不是始終使用最新版本。此輸出被截斷。列出可用的版本。
$ apt-cache madison docker-ce docker-ce | 17.12.0~ce-0~ubuntu | https://download.docker.com/linux/ubuntu zesty/stable amd64 Packages docker-ce | 17.09.1~ce-0~ubuntu | https://download.docker.com/linux/ubuntu zesty/stable amd64 Packages docker-ce | 17.09.0~ce-0~ubuntu | https://download.docker.com/linux/ubuntu zesty/stable amd64 Packages docker-ce | 17.06.2~ce-0~ubuntu | https://download.docker.com/linux/ubuntu zesty/stable amd64 Packages docker-ce | 17.06.1~ce-0~ubuntu | https://download.docker.com/linux/ubuntu zesty/stable amd64 Packages docker-ce | 17.06.0~ce-0~ubuntu | https://download.docker.com/linux/ubuntu zesty/stable amd64 Packages
列表的內容取決于啟用了哪個存儲庫。選擇一個特定的版本進行安裝。第二列是版本字符串。第三列是存儲庫名稱,它指出了軟件包來自哪個存儲庫,并通過擴展其穩定性級別。要安裝特定版本,請將版本字符串附加到包名稱,并用等號(=)將它們分開:
$ sudo apt-get install docker-ce=
4.通過運行hello-world 映像驗證是否正確安裝了Docker CE 。
$ docker run hello-world
這個命令下載一個測試圖像并在容器中運行。容器運行時,會打印一條信息消息并退出。
Unable to find image "hello-world:latest" locally latest: Pulling from library/hello-world ca4f61b1923c: Pull complete Digest: sha256:445b2fe9afea8b4aa0b2f27fe49dd6ad130dfe7a8fd0832be5de99625dad47cd Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://cloud.docker.com/ For more examples and ideas, visit: https://docs.docker.com/engine/userguide/以非root用戶身份管理Docker
默認情況下,docker 命令會使用 Unix socket 與 Docker 引擎通訊。而只有 root 用戶和 docker 組的用戶才可以訪問 Docker 引擎的 Unix socket。出于安全考慮,一般 Linux 系統上不會直接使用 root 用戶。因此,更好地做法是將需要使用 docker 的用戶加入 docker 用戶組。
要創建docker組并添加您的用戶:
1.創建docker組。
$ sudo groupadd docker
2.將您的用戶添加到docker組中。
$ sudo usermod -aG docker $USER
3.注銷并重新登錄,如果在虛擬機上進行測試,則可能需要重新啟動虛擬機才能使更改生效。
4.驗證您可以不運行docker命令sudo。
$ docker run hello-world卸載Docker CE
1.卸載Docker CE軟件包:
$ sudo apt-get purge docker-ce
2.主機上的圖像,容器,卷或自定義配置文件不會自動刪除。刪除所有圖像,容器和卷:
$ sudo rm -rf /var/lib/docker利用 commit 理解鏡像構成
這條命令會用nginx 鏡像啟動一個容器,命名為 myweb,并且映射了 80 端口,這樣我們可以用瀏覽器去訪問這個 nginx 服務器。
$ docker run --name myweb -d -p 80:80 nginx
直接訪問:http://localhost;如果使用的是 Docker Toolbox,或者是在虛擬機、云服務器上安裝的 Docker,則需要將 localhost 換為虛擬機地址或者實際云服務器地址。
現在,假設我們非常不喜歡這個歡迎頁面,我們希望改成歡迎 Docker 的文字,我們可以使用 docker exec 命令進入容器,修改其內容。
$ docker exec -it myweb bash root@5ceb0c8274ca:/# echo "Welcome to Docker!
" > /usr/share/nginx/html/index.html root@5ceb0c8274ca:/# exit exit
直接訪問:http://localhost;
我們修改了容器的文件,也就是改動了容器的存儲層。我們可以通過 docker diff 命令看到具體的改動。COMMENT列有備注!
$ docker diff myweb C /root A /root/.bash_history C /run A /run/nginx.pid C /usr/share/nginx/html/index.html C /var/cache/nginx D /var/cache/nginx/client_temp D /var/cache/nginx/fastcgi_temp D /var/cache/nginx/proxy_temp D /var/cache/nginx/scgi_temp D /var/cache/nginx/uwsgi_temp root@souyunku:~/mydocker#
我們可以用下面的命令將容器保存為鏡像:
$ docker commit --author "penglei" --message "修改了默認網頁" myweb nginx:v2 sha256:33b2e2aefccbaba54021c85ef7966c7d488abaa0677728e1b057c56a7734a4f0
其中 --author 是指定修改的作者,而 --message 則是記錄本次修改的內容。這點和 git 版本控制相似,不過這里這些信息可以省略留空。
我們可以在 docker image ls 中看到這個新定制的鏡像:
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nginx v2 33b2e2aefccb About a minute ago 108MB nginx latest 3f8a4339aadd 3 days ago 108MB hello-world latest f2a91732366c 5 weeks ago 1.85kB
$ docker history nginx:v2 IMAGE CREATED CREATED BY SIZE COMMENT 33b2e2aefccb 2 minutes ago nginx -g daemon off; 325B 修改了默認網頁 3f8a4339aadd 3 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B3 days ago /bin/sh -c #(nop) STOPSIGNAL [SIGTERM] 0B 3 days ago /bin/sh -c #(nop) EXPOSE 80/tcp 0B 3 days ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx… 22B 3 days ago /bin/sh -c set -x && apt-get update && apt… 53.2MB 3 days ago /bin/sh -c #(nop) ENV NJS_VERSION=1.13.8.0.… 0B 3 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.13.8-… 0B 2 weeks ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B 2 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B 2 weeks ago /bin/sh -c #(nop) ADD file:f30a8b5b7cdc9ba33… 55.3MB
新的鏡像定制好后,我們可以來運行這個鏡像。
$ docker run --name web2 -d -p 81:80 nginx:v2 ed8c54aeb3c540981b892c0cdfbf9330114ecc935149190e073f49295f2ae147
直接訪問:http://localhost:81;如果使用的是 Docker Toolbox,或者是在虛擬機、云服務器上安裝的 Docker,則需要將 localhost 換為虛擬機地址或者實際云服務器地址。
使用 Dockerfile 定制鏡像從剛才的 docker commit 的學習中,我們可以了解到,鏡像的定制實際上就是定制每一層所添加的配置、文件。如果我們可以把每一層修改、安裝、構建、操作的命令都寫入一個腳本,用這個腳本來構建、定制鏡像,那么之前提及的無法重復的問題、鏡像構建透明性的問題、體積的問題就都會解決。這個腳本就是 Dockerfile。
Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。
還以之前定制 nginx 鏡像為例,這次我們使用 Dockerfile 來定制。
在一個空白目錄中,建立一個文本文件,并命名為 Dockerfile:
$ mkdir mynginx $ cd mynginx $ touch Dockerfile
其內容為:
FROM nginx RUN echo "Hello, Docker!
" > /usr/share/nginx/html/index.html
這個 Dockerfile 很簡單,一共就兩行。涉及到了兩條指令,FROM 和 RUN。
FROM 指定基礎鏡像所謂定制鏡像,那一定是以一個鏡像為基礎,在其上進行定制。就像我們之前運行了一個 nginx 鏡像的容器,再進行修改一樣,基礎鏡像是必須指定的。而 FROM 就是指定基礎鏡像,因此一個 Dockerfile 中 FROM 是必備的指令,并且必須是第一條指令。
在 Docker Store 上有非常多的高質量的官方鏡像,有可以直接拿來使用的服務類的鏡像,如 nginx、redis、mongo、mysql、httpd、php、tomcat 等;也有一些方便開發、構建、運行各種語言應用的鏡像,如 node、openjdk、python、ruby、golang 等。可以在其中尋找一個最符合我們最終目標的鏡像為基礎鏡像進行定制。
如果沒有找到對應服務的鏡像,官方鏡像中還提供了一些更為基礎的操作系統鏡像,如 ubuntu、debian、centos、fedora、alpine 等,這些操作系統的軟件庫為我們提供了更廣闊的擴展空間。
除了選擇現有鏡像為基礎鏡像外,Docker 還存在一個特殊的鏡像,名為 scratch。這個鏡像是虛擬的概念,并不實際存在,它表示一個空白的鏡像。
FROM scratch ...
如果你以 scratch 為基礎鏡像的話,意味著你不以任何鏡像為基礎,接下來所寫的指令將作為鏡像第一層開始存在。
不以任何系統為基礎,直接將可執行文件復制進鏡像的做法并不罕見,比如 swarm、coreos/etcd。對于 Linux 下靜態編譯的程序來說,并不需要有操作系統提供運行時支持,所需的一切庫都已經在可執行文件里了,因此直接 FROM scratch 會讓鏡像體積更加小巧。使用 Go 語言 開發的應用很多會使用這種方式來制作鏡像,這也是為什么有人認為 Go 是特別適合容器微服務架構的語言的原因之一。
RUN 執行命令RUN 指令是用來執行命令行命令的。由于命令行的強大能力,RUN 指令在定制鏡像時是最常用的指令之一。其格式有兩種:
shell 格式:RUN <命令>,就像直接在命令行中輸入的命令一樣。剛才寫的 Dockerfile 中的 RUN 指令就是這種格式。
RUN echo "Hello, Docker!
" > /usr/share/nginx/html/index.html
exec 格式:RUN ["可執行文件", "參數1", "參數2"],這更像是函數調用中的格式。
既然 RUN 就像 Shell 腳本一樣可以執行命令,那么我們是否就可以像 Shell 腳本一樣把每個命令對應一個 RUN 呢?比如這樣:
FROM debian:jessie RUN apt-get update RUN apt-get install -y gcc libc6-dev make RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" RUN mkdir -p /usr/src/redis RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 RUN make -C /usr/src/redis RUN make -C /usr/src/redis install
之前說過,Dockerfile 中每一個指令都會建立一層,RUN 也不例外。每一個 RUN 的行為,就和剛才我們手工建立鏡像的過程一樣:新建立一層,在其上執行這些命令,執行結束后,commit 這一層的修改,構成新的鏡像。
而上面的這種寫法,創建了 7 層鏡像。這是完全沒有意義的,而且很多運行時不需要的東西,都被裝進了鏡像里,比如編譯環境、更新的軟件包等等。結果就是產生非常臃腫、非常多層的鏡像,不僅僅增加了構建部署的時間,也很容易出錯。 這是很多初學 Docker 的人常犯的一個錯誤。
Union FS 是有最大層數限制的,比如 AUFS,曾經是最大不得超過 42 層,現在是不得超過 127 層。
上面的 Dockerfile 正確的寫法應該是這樣:
FROM debian:jessie RUN buildDeps="gcc libc6-dev make" && apt-get update && apt-get install -y $buildDeps && wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" && mkdir -p /usr/src/redis && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 && make -C /usr/src/redis && make -C /usr/src/redis install && rm -rf /var/lib/apt/lists/* && rm redis.tar.gz && rm -r /usr/src/redis && apt-get purge -y --auto-remove $buildDeps
首先,之前所有的命令只有一個目的,就是編譯、安裝 redis 可執行文件。因此沒有必要建立很多層,這只是一層的事情。因此,這里沒有使用很多個 RUN 對一一對應不同的命令,而是僅僅使用一個 RUN 指令,并使用 && 將各個所需命令串聯起來。將之前的 7 層,簡化為了 1 層。在撰寫 Dockerfile 的時候,要經常提醒自己,這并不是在寫 Shell 腳本,而是在定義每一層該如何構建。
并且,這里為了格式化還進行了換行。Dockerfile 支持 Shell 類的行尾添加 的命令換行方式,以及行首 # 進行注釋的格式。良好的格式,比如換行、縮進、注釋等,會讓維護、排障更為容易,這是一個比較好的習慣。
此外,還可以看到這一組命令的最后添加了清理工作的命令,刪除了為了編譯構建所需要的軟件,清理了所有下載、展開的文件,并且還清理了 apt 緩存文件。這是很重要的一步,我們之前說過,鏡像是多層存儲,每一層的東西并不會在下一層被刪除,會一直跟隨著鏡像。因此鏡像構建時,一定要確保每一層只添加真正需要添加的東西,任何無關的東西都應該清理掉。
很多人初學 Docker 制作出了很臃腫的鏡像的原因之一,就是忘記了每一層構建的最后一定要清理掉無關文件。
構建鏡像好了,讓我們再回到之前定制的 nginx 鏡像的 Dockerfile 來。現在我們明白了這個 Dockerfile 的內容,那么讓我們來構建這個鏡像吧。
在 Dockerfile 文件所在目錄執行:
$ docker build -t nginx:v3 . Sending build context to Docker daemon 2.048kB Step 1/2 : FROM nginx ---> 3f8a4339aadd Step 2/2 : RUN echo "Hello, Docker!
" > /usr/share/nginx/html/index.html ---> Running in 5cdac6d29a52 Removing intermediate container 5cdac6d29a52 ---> 56a1b67b2533 Successfully built 56a1b67b2533 Successfully tagged nginx:v3
從命令的輸出結果中,我們可以清晰的看到鏡像的構建過程。在 Step 2 中,如同我們之前所說的那樣,RUN 指令啟動了一個容器 5cdac6d29a52,執行了所要求的命令,并最后提交了這一層 56a1b67b2533,隨后刪除了所用到的這個容器 5cdac6d29a52
這里我們使用了 docker build 命令進行鏡像構建。其格式為:
$ docker build [選項] <上下文路徑/URL/->
鏡像構建上下文(Context)如果注意,會看到 docker build 命令最后有一個 .。. 表示當前目錄
其它 docker build 的用法 直接用 Git repo 進行構建或許你已經注意到了,docker build 還支持從 URL 構建,比如可以直接從 Git repo 中構建:
感謝:漠然提供 Git dockerfile repo
$ docker build https://github.com/mritd/dockerfile.git#:alpine-glibc
... Executing ca-certificates-20171114-r0.post-deinstall Executing busybox-1.27.2-r6.trigger OK: 11 MiB in 14 packages Removing intermediate container baf41e622959 ---> aded3329be1b Step 3/3 : ENV LANG=C.UTF-8 ---> Running in 8c34e0f4d25b Removing intermediate container 8c34e0f4d25b ---> c493a5aa5eb7 Successfully built c493a5aa5eb7
這行命令指定了構建所需的 Git repo,并且指定默認的 master 分支,構建目錄為 /alpine-glibc/,然后 Docker 就會自己去 git clone 這個項目、切換到指定分支、并進入到指定目錄后開始構建。
用給定的 tar 壓縮包構建$ docker build http://server/context.tar.gz
如果所給出的 URL 不是個 Git repo,而是個 tar 壓縮包,那么 Docker 引擎會下載這個包,并自動解壓縮,以其作為上下文,開始構建。
從標準輸入中讀取 Dockerfile 進行構建$ docker build - < Dockerfile
或
$ cat Dockerfile | docker build -
如果標準輸入傳入的是文本文件,則將其視為 Dockerfile,并開始構建。這種形式由于直接從標準輸入中讀取 Dockerfile 的內容,它沒有上下文,因此不可以像其他方法那樣可以將本地文件 COPY 進鏡像之類的事情。
從標準輸入中讀取上下文壓縮包進行構建$ docker build - < context.tar.gz
如果發現標準輸入的文件格式是 gzip、bzip2 以及 xz 的話,將會使其為上下文壓縮包,直接將其展開,將里面視為上下文,并開始構建。
參考:Docker — 從入門到實踐
https://www.gitbook.com/download/pdf/book/yeasy/docker_practice
參考:Docker 官網 Get Docker CE for Ubuntu
https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#install-using-the-convenience-script
Contact作者:鵬磊
出處:http://www.ymq.io
Email:admin@souyunku.com
版權歸作者所有,轉載請注明出處
Wechat:關注公眾號,搜云庫,專注于開發技術的研究與知識分享
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/39732.html
摘要:容器運行時,會打印一條信息消息并退出。因此,更好地做法是將需要使用的用戶加入用戶組。涉及到了兩條指令,和。執行命令指令是用來執行命令行命令的。 Docker 是個劃時代的開源項目,它徹底釋放了計算虛擬化的威力,極大提高了應用的運行效率,降低了云計算資源供應的成本!使用 Docker,可以讓應用的部署、測試和分發都變得前所未有的高效和輕松! 無論是應用開發者、運維人員、還是其他信息技術從...
摘要:上一篇文章搭建了一個具有基礎功能的私有倉庫,這次來搭建一個擁有權限認證的私有倉庫。移動證書到目錄。身份驗證為用戶創建一個帶有一個條目的密碼文件,密碼為創建倉庫啟動注冊表,指示它使用證書。注冊表在端口默認的端口上運行。 上一篇文章搭建了一個具有基礎功能的私有倉庫,這次來搭建一個擁有權限認證、TLS 的私有倉庫。 環境準備 系統:Ubuntu 17.04 x64 IP:198.13.48...
摘要:私有倉庫是,并在中運行。不要使用或為主機名注冊表服務需要由外部客戶端訪問或,默認為用于訪問和令牌通知服務的協議。打開或關閉,默認打開打開此屬性時,準備腳本創建私鑰和根證書,用于生成驗證注冊表令牌。 上一篇文章搭建了一個具有基礎功能,權限認證、TLS 的私有倉庫,但是Docker Registry 作為鏡像倉庫,連管理界面都沒有,甚至連一些運維必備的功能都是缺失的,還有什么 Docker...
摘要:一個使用容器的應用,通常由多個容器組成。使用,不再需要使用腳本來啟動容器。 Docker 部署SpringBoot項目整合 Redis 鏡像做訪問計數Demo 最終效果如下 showImg(https://segmentfault.com/img/remote/1460000012799923?w=841&h=433); 大概就幾個步驟 1.安裝 Docker CE 2.運行 Red...
摘要:一個用于構建和推送鏡像的插件。這樣即可使用進行構建鏡像啦。構建鏡像使用命令啟動鏡像訪問服務瀏覽器輸入宿主機能夠正常看到界面文章開頭的最終效果頁面。 一個用于構建和推送Docker鏡像的Maven插件。 使用Maven插件構建Docker鏡像,將Docker鏡像push到DockerHub上,或者私有倉庫,上一篇文章是手寫Dockerfile,這篇文章借助開源插件docker-maven...
閱讀 771·2023-04-25 20:47
閱讀 2534·2019-08-30 15:53
閱讀 947·2019-08-26 14:05
閱讀 894·2019-08-26 11:59
閱讀 1679·2019-08-26 11:43
閱讀 1679·2019-08-26 10:57
閱讀 1355·2019-08-23 18:23
閱讀 2639·2019-08-23 12:57