Docker是一個簡化容器中應用程序進程管理過程的應用程序。容器容許您在資源隔離的進程中運行應用程序。它們與虛擬機相似,但容器更便攜,更加資源友好,而且更依賴於主機操做系統。javascript
在本教程中,您將在Debian 9上安裝和使用Docker Community Edition(CE)。您將安裝Docker自己,使用容器和映像,並將映像推送到Docker存儲庫。php
要學習本教程,您須要具有如下條件:java
官方Debian存儲庫中提供的Docker安裝包可能不是最新版本。爲了確保咱們得到最新版本,咱們將從官方Docker存儲庫安裝Docker。爲此,咱們將添加一個新的包源,從Docker添加GPG密鑰以確保下載有效,而後安裝該包。node
首先,更新現有的包列表:mysql
sudo apt update
接下來,安裝一些容許apt
使用包經過HTTPS的必備軟件包:linux
sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common
而後將官方Docker存儲庫的GPG密鑰添加到您的系統:nginx
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
將Docker存儲庫添加到APT源:git
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
接下來,使用新添加的repo中的Docker包更新包數據庫:sql
sudo apt update
確保您要從Docker repo而不是默認的Debian repo安裝:docker
apt-cache policy docker-ce
雖然Docker的版本號可能不一樣,但您會看到這樣的輸出:
docker-ce: Installed: (none) Candidate: 18.06.1~ce~3-0~debian Version table: 18.06.1~ce~3-0~debian 500 500 https://download.docker.com/linux/debian stretch/stable amd64 Packages
請注意,docker-ce
未安裝,但安裝的候選者來自Debian 9(stretch
)的Docker存儲庫。
最後,安裝Docker:
sudo apt install docker-ce
如今應該安裝Docker,守護進程啓動,並啓用進程啓動進程。檢查它是否正在運行:
sudo systemctl status docker
輸出應相似於如下內容,代表該服務處於活動狀態並正在運行:
● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2018-07-05 15:08:39 UTC; 2min 55s ago Docs: https://docs.docker.com Main PID: 21319 (dockerd) CGroup: /system.slice/docker.service ├─21319 /usr/bin/dockerd -H fd:// └─21326 docker-containerd --config /var/run/docker/containerd/containerd.toml
如今安裝Docker不只能夠爲您提供Docker服務(守護程序),還能夠爲您提供docker
命令行實用程序或Docker客戶端。咱們將在本教程後面探討如何使用該docker
命令。
默認狀況下,該docker
命令只能由root用戶或docker組中的用戶運行,該用戶在Docker的安裝過程當中自動建立。若是您嘗試運行該docker
命令而不使用sudo
或不在docker組中做爲前綴,您將得到以下輸出:
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?. See 'docker run --help'.
若是要在運行docker
命令時避免鍵入sudo
,請將用戶名添加到docker
組中:
sudo usermod -aG docker ${USER}
要應用新的組成員身份,請註銷服務器並從新登陸,或鍵入如下內容:
su - ${USER}
系統將提示您輸入用戶密碼以繼續。
經過鍵入如下內容確認您的用戶現已添加到docker組:
id -nG
sammy sudo docker
若是您須要將用戶添加到您未登陸的docker
組中,請使用如下方式明確聲明該用戶名:
sudo usermod -aG docker username
本文的其他部分假定您以docker組中的用戶身份運行該docker
命令。若是您選擇不這樣作,請使用sudo
在前面添加命令。
讓咱們接下來探討docker
命令。
使用docker
包括傳遞一系列選項和命令,後跟參數。語法採用如下形式:
docker [option] [command] [arguments]
要查看全部可用的子命令,請鍵入:
docker
從Docker 18開始,可用子命令的完整列表包括:
attach Attach local standard input, output, and error streams to a running container build Build an image from a Dockerfile commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes to files or directories on a container's filesystem events Get real time events from the server exec Run a command in a running container export Export a container's filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information inspect Return low-level information on Docker objects kill Kill one or more running containers load Load an image from a tar archive or STDIN login Log in to a Docker registry logout Log out from a Docker registry logs Fetch the logs of a container pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart one or more containers rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save one or more images to a tar archive (streamed to STDOUT by default) search Search the Docker Hub for images start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers version Show the Docker version information wait Block until one or more containers stop, then print their exit codes
要查看特定命令可用的選項,請鍵入:
docker docker-subcommand --help
要查看有關Docker的系統範圍信息,請使用:
docker info
讓咱們探討其中的一些命令。咱們將從處理圖像開始。
Docker容器是從Docker鏡像構建的。默認狀況下,Docker從Docker Hub中獲取這些映像,Docker Hub是由Docker管理的Docker註冊表,Docker項目背後的公司。任何人均可以在Docker Hub上託管他們的Docker鏡像,所以您須要的大多數應用程序和Linux發行版都將在那裏託管圖像。
要檢查您是否能夠從Docker Hub訪問和下載圖像,請鍵入:
docker run hello-world
輸出將指示Docker正常工做:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world 9db2ca6ccae0: Pull complete Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. ...
Docker最初沒法在本地找到hello-world
圖像,所以它從Docker Hub下載了圖像,Docker Hub是默認存儲庫。下載映像後,Docker從映像建立了一個容器,並在容器中執行了應用程序,顯示了該消息。
您能夠經過使用命令 search
子命令和 docker
命令來搜索Docker Hub上可用的圖像。例如,要搜索Ubuntu映像,請鍵入:
docker search ubuntu
該腳本將對Docker Hub進行爬網,並返回名稱與搜索字符串匹配的全部圖像的列表。在這種狀況下,輸出將相似於:
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 8320 [OK] dorowu/ubuntu-desktop-lxde-vnc Ubuntu with openssh-server and NoVNC 214 [OK] rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… 170 [OK] consol/ubuntu-xfce-vnc Ubuntu container with "headless" VNC session… 128 [OK] ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ansible 95 [OK] ubuntu-upstart Upstart is an event-based replacement for th… 88 [OK] neurodebian NeuroDebian provides neuroscience research s… 53 [OK] 1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 43 [OK] ubuntu-debootstrap debootstrap --variant=minbase --components=m… 39 [OK] nuagebec/ubuntu Simple always updated Ubuntu docker images w… 23 [OK] tutum/ubuntu Simple Ubuntu docker images with SSH access 18 i386/ubuntu Ubuntu is a Debian-based Linux operating sys… 13 1and1internet/ubuntu-16-apache-php-7.0 ubuntu-16-apache-php-7.0 12 [OK] ppc64le/ubuntu Ubuntu is a Debian-based Linux operating sys… 12 eclipse/ubuntu_jdk8 Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, … 6 [OK] darksheer/ubuntu Base Ubuntu Image -- Updated hourly 4 [OK] codenvy/ubuntu_jdk8 Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, … 4 [OK] 1and1internet/ubuntu-16-nginx-php-5.6-wordpress-4 ubuntu-16-nginx-php-5.6-wordpress-4 3 [OK] pivotaldata/ubuntu A quick freshening-up of the base Ubuntu doc… 2 1and1internet/ubuntu-16-sshd ubuntu-16-sshd 1 [OK] ossobv/ubuntu Custom ubuntu image from scratch (based on o… 0 smartentry/ubuntu ubuntu with smartentry 0 [OK] 1and1internet/ubuntu-16-healthcheck ubuntu-16-healthcheck 0 [OK] pivotaldata/ubuntu-gpdb-dev Ubuntu images for GPDB development 0 paasmule/bosh-tools-ubuntu Ubuntu based bosh-cli 0 [OK] ...
在OFFICIAL列中,OK表示由項目後面的公司構建和支持的圖像。肯定要使用的映像後,可使用pull
子命令將其下載到計算機。
執行如下命令將官方ubuntu
映像下載到您的計算機:
docker pull ubuntu
您將看到如下輸出:
Using default tag: latest latest: Pulling from library/ubuntu 6b98dfc16071: Pull complete 4001a1209541: Pull complete 6319fc68c576: Pull complete b24603670dc3: Pull complete 97f170c87c6f: Pull complete Digest: sha256:5f4bdc3467537cbbe563e80db2c3ec95d548a9145d64453b06939c4592d67b6d Status: Downloaded newer image for ubuntu:latest
下載映像後,可使用帶有run
子命令的下載映像運行容器。正如您在hello-world
示例中看到的,若是在使用run
子命令執行docker
時未下載圖像,則Docker客戶端將首先下載圖像,而後使用它運行容器。
要查看已下載到計算機的圖像,請鍵入:
docker images
輸出應相似於如下內容:
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 16508e5c265d 13 days ago 84.1MB hello-world latest 2cb0d9787c4d 7 weeks ago 1.85kB
正如您將在本教程後面看到的那樣,用於運行容器的圖像能夠被修改並用於生成新圖像,而後能夠將其上載(推送是技術術語)到Docker Hub或其餘Docker註冊表。
咱們來看看如何更詳細地運行容器。
在您在上一步中運行的hello-world
容器是一類容器的例子,那就是發出測試消息後運行而且退出的容器。容器能夠比這更有用,它們能夠是交互式的。畢竟,它們相似於虛擬機,可是時屬於資源更加友好型的。
舉個例子,讓咱們使用Ubuntu的最新圖像運行一個容器。-i和-t開關的組合爲您提供了對容器的交互式shell訪問:
docker run -it ubuntu
您的命令提示符應該更改以反映您如今正在容器內工做的事實,並應採用如下形式:
root@d9b100f2f636:/#
請注意命令提示符中的容器ID。在這個例子中,它是d9b100f2f636
。稍後您須要該容器ID以在要刪除容器時標識容器。
如今您能夠在容器內運行任何命令。例如,讓咱們更新容器內的包數據庫。您不須要使用sudo
來爲任何命令添加前綴,由於您以root用戶身份在容器內操做:
apt update
而後在其中安裝任何應用程序。咱們安裝Node.js:
apt install nodejs
這將從官方Ubuntu存儲庫中安裝容器中的Node.js. 安裝完成後,驗證是否已安裝Node.js:
node -v
您將看到終端中顯示的版本號:
v8.10.0
您在容器內進行的任何更改僅適用於該容器。
要退出容器,請在提示符處鍵入 exit
。
讓咱們看看下一步管理咱們系統上的容器。
使用Docker一段時間後,您的計算機上將有許多活動(運行)和非活動容器。要查看活動的,請使用:
docker ps
您將看到相似於如下內容的輸出:
CONTAINER ID IMAGE COMMAND CREATED
在本教程中,您啓動了兩個容器; 一個來自hello-world
圖像,另外一個來自ubuntu
圖像。兩個容器都再也不運行,但它們仍然存在於您的系統上。
要查看全部容器 - 活動和非活動,請 使用-a
開關運行docker ps
:
docker ps -a
您將看到相似於此的輸出:
d9b100f2f636 ubuntu "/bin/bash" About an hour ago Exited (0) 8 minutes ago sharp_volhard 01c950718166 hello-world "/hello" About an hour ago Exited (0) About an hour ago festive_williams
要查看您建立的最新容器,請將其傳遞給-l
交換機:
docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9b100f2f636 ubuntu "/bin/bash" About an hour ago Exited (0) 10 minutes ago sharp_volhard
要啓動已中止的容器,請使用docker start
,後跟容器ID或容器名稱。讓咱們啓動基於Ubuntu的容器,其ID爲 d9b100f2f636
:
docker start d9b100f2f636
容器將啓動,您可使用docker ps
來查看其狀態:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9b100f2f636 ubuntu "/bin/bash" About an hour ago Up 8 seconds sharp_volhard
要中止正在運行的容器,請使用docker stop
,後跟容器ID或名稱。此次,咱們將使用Docker分配容器的名稱,即sharp_volhard
:
docker stop sharp_volhard
一旦您決定再也不須要容器,請使用該docker rm
命令將其刪除,再次使用容器ID或名稱。使用該docker ps -a
命令查找與hello-world
映像關聯的容器的容器ID或名稱,而後將其刪除。
docker rm festive_williams
您可使用--name
開關啓動一個新容器併爲其命名。您還可使用該--rm
開關建立一個在中止時自行刪除的容器。有關這些選項和其餘選項的更多信息,請參閱該docker run help
命令。
容器能夠轉換爲可用於構建新容器的映像。讓咱們來看看它是如何工做的。
當您啓動Docker鏡像時,您能夠像使用虛擬機同樣建立,修改和刪除文件。您所作的更改僅適用於該容器。您能夠啓動和中止它,可是一旦使用該docker rm
命令銷燬它,更改將永久丟失。
本節介紹如何將容器的狀態保存爲新的Docker鏡像。
在Ubuntu容器中安裝Node.js後,您如今有一個運行圖像的容器,但容器與您用來建立它的圖像不一樣。可是您可能但願稍後從新使用此Node.js容器做爲新映像的基礎。
而後使用如下命令將更改提交到新的Docker鏡像實例。
docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name
該-m開關是提交信息,能夠幫助你和其餘人知道你所作的修改,而-a用於指定做者。當您啓動交互式Docker會話時,container_id
是您在本教程前面提到的那個。除非您在Docker Hub上建立了其餘存儲庫,不然repository
一般是您的Docker Hub用戶名。
例如,對於用戶sammy,使用容器ID d9b100f2f636
,命令將是:
docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs
當你提交的圖像,新的圖像在您的計算機上本地保存。在本教程的後面,您將學習如何將映像推送到Docker Hub之類的Docker註冊表,以便其餘人能夠訪問它。
再次列出Docker圖像將顯示新圖像以及從中派生的舊圖像:
docker images
你會看到這樣的輸出:
REPOSITORY TAG IMAGE ID CREATED SIZE
sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB ubuntu latest 113a43faa138 4 weeks ago 81.2MB hello-world latest e38bc07ac18e 2 months ago 1.85kB
在此示例中,ubuntu-nodejs
是新圖像,它是從Docker Hub 的現有ubuntu
圖像派生的。尺寸差別反映了所作的變化。在此示例中,更改是NodeJS已安裝。所以,下次須要使用預先安裝了NodeJS的Ubuntu運行容器時,您可使用新映像。
您還能夠從Dockerfile
構建映像,這樣能夠在新映像中自動安裝軟件。可是,這超出了本教程的範圍。
如今讓咱們與他人分享新圖像,以便他們能夠從中建立容器。
從現有映像建立新映像以後的下一個邏輯步驟是與您選擇的幾個朋友,Docker Hub上的整個世界或您能夠訪問的其餘Docker註冊表共享它。要將映像推送到Docker Hub或任何其餘Docker註冊表,您必須在那裏擁有一個賬戶。
本節介紹如何將Docker鏡像推送到Docker Hub。
要推送圖像,請先登陸Docker Hub。
docker login -u docker-registry-username
系統將提示您使用Docker Hub密碼進行身份驗證。若是您指定了正確的密碼,則身份驗證應該成功。
注意:若是Docker註冊表用戶名與用於建立映像的本地用戶名不一樣,則必須使用註冊表用戶名標記映像。對於上一步中給出的示例,您能夠鍵入:
docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
而後你可使用如下方法推送本身的圖像
docker push docker-registry-username/docker-image-name
要將ubuntu-nodejs
圖像推送到sammy存儲庫,命令將是:
docker push sammy/ubuntu-nodejs
上傳圖像時,該過程可能須要一些時間才能完成,但完成後,輸出將以下所示:
The push refers to a repository [docker.io/sammy/ubuntu-nodejs] e3fbbfb44187: Pushed 5f70bf18a086: Pushed a3b5c80a4eba: Pushed 7f18b442972b: Pushed 3ce512daaf78: Pushed 7aae4540b42d: Pushed ...
將圖像推送到註冊表後,它應該列在您賬戶的儀表板上,以下圖所示。
若是推送嘗試致使此類錯誤,那麼您可能沒有登陸:
OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs] e3fbbfb44187: Preparing 5f70bf18a086: Preparing a3b5c80a4eba: Preparing 7f18b442972b: Preparing 3ce512daaf78: Preparing 7aae4540b42d: Waiting unauthorized: authentication required
登陸docker login
並重復推送嘗試。而後驗證它是否存在於Docker Hub存儲庫頁面上。
您如今可使用docker pull sammy/ubuntu-nodejs
將圖像拉到新計算機並使用它來運行新容器。
在本教程中,您安裝了Docker,使用了圖像和容器,並將修改後的圖像推送到Docker Hub。
更多Docker教程請前往騰訊雲+社區學習更多知識。
參考文獻:《How to Install and Use Docker on Debian 9》
原創聲明,本文系做者受權雲+社區發表,未經許可,不得轉載。
若有侵權,請聯繫 yunjia_community@tencent.com 刪除。