溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Docker入門(mén)詳細(xì)介紹

發(fā)布時(shí)間:2021-06-28 15:39:13 來(lái)源:億速云 閱讀:156 作者:chen 欄目:編程語(yǔ)言

本篇內(nèi)容主要講解“Docker入門(mén)詳細(xì)介紹”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Docker入門(mén)詳細(xì)介紹”吧!

一、為什么選擇 Docker

傳統(tǒng)虛擬機(jī)的缺點(diǎn):資源占用十分多、冗余步驟多、啟動(dòng)很慢。

Docker 的優(yōu)勢(shì):使用容器化技術(shù),項(xiàng)目代碼帶上環(huán)境配置打包成鏡像,上傳到鏡像倉(cāng)庫(kù),別人下載鏡像即可運(yùn)行,不再需要復(fù)雜的環(huán)境配置。

「注意:容器化技術(shù)不是模擬一個(gè)完整的操作系統(tǒng)」。所以 Docker 之所以能火,是因?yàn)樗绕胀ㄌ摂M機(jī)輕巧!

Docker 和虛擬機(jī)技術(shù)的不同:

  • 傳統(tǒng)虛擬機(jī),虛擬出一條硬件,運(yùn)行一個(gè)完整的操作系統(tǒng),然后在這個(gè)系統(tǒng)上安裝和運(yùn)行軟件;

  • Docker 容器內(nèi)的應(yīng)用直接運(yùn)行在宿主機(jī)的內(nèi)容,容器是沒(méi)有自己的內(nèi)核的,也沒(méi)有虛擬我們的硬件,所以就輕便了;

  • 每個(gè)容器間是互相隔離,每個(gè)容器內(nèi)都有一個(gè)屬于自己的文件系統(tǒng),互不影響。

二、Docker 中的幾個(gè)術(shù)語(yǔ)

Docker的相關(guān)術(shù)語(yǔ):

  • 鏡像 (image)

  • 容器 (container)

  • 倉(cāng)庫(kù) (repository)

鏡像可以認(rèn)為是一些軟件和配置環(huán)境的整體打包。

容器可以認(rèn)為是一個(gè)精簡(jiǎn)的 Linux 系統(tǒng),它是通過(guò)鏡像運(yùn)行起來(lái)的實(shí)例,鏡像運(yùn)行起來(lái)就是容器。從這個(gè)角度來(lái)講,鏡像就類(lèi)似于 Java 中的 Class 類(lèi)型,由它可以創(chuàng)建多個(gè)實(shí)例。

鏡像是存在硬盤(pán)上的東西,鏡像運(yùn)行起來(lái),就形成一個(gè)容器,容器才是真正跑起來(lái)的程序。只不過(guò)在 Docker 中,我們可以進(jìn)入容器,做一些操作,然后再把容器中的改動(dòng)提交形成一個(gè)新的鏡像。

倉(cāng)庫(kù)類(lèi)似于 Github,我們寫(xiě)好的代碼會(huì)提交到 Github 上面進(jìn)行保存和管理,方便在其他地方也能下載代碼。鏡像倉(cāng)庫(kù)也是類(lèi)似的,制作好的鏡像,就把它放到鏡像倉(cāng)庫(kù),方便其他人直接用鏡像部署。

三、Docker 安裝與卸載

環(huán)境準(zhǔn)備,Linux 要求內(nèi)核 3.0 以上,我這里使用的阿里云服務(wù)器(CentOS 8),查看相關(guān)信息的命令如下:

?  ~ uname -r    
4.18.0-193.14.2.el8_2.x86_64   # 要求 3.0 以上
?  ~ cat /etc/os-release 
NAME="CentOS Linux"
VERSION="8 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Linux 8 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="8"

Docker 的安裝參照其官方文檔按照步驟來(lái)就完全可以(Docker 的官方文檔相當(dāng)?shù)脑敿?xì)),網(wǎng)址:https://docs.docker.com/engine/install/

這里為了方便為大家把安裝步驟以及相應(yīng)的注釋寫(xiě)出來(lái):

1、卸載舊版本,如果服務(wù)器上沒(méi)安裝過(guò) docker 就不用進(jìn)行此步驟。

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2、需要的安裝包:

yum install -y yum-utils

3、設(shè)置鏡像的倉(cāng)庫(kù),官方文檔中默認(rèn)是國(guó)外的倉(cāng)庫(kù),不推薦使用,這里推薦使用國(guó)內(nèi)的,如下:

yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新 yum 軟件包索引:

yum makecache fast # 注意:如果是 centos 8 版本則直接使用 yum makecache 即可

4、安裝 docker ,docker-ce 代表為社區(qū)版,而 ee 代表是企業(yè)版,此處安裝社區(qū)版。

yum install docker-ce docker-ce-cli containerd.io

注意:版本為 centos 8 時(shí)執(zhí)行上述命令時(shí)會(huì)報(bào)錯(cuò),說(shuō)的是 containerd.io >= 1.2.2-3,解決方法:

(1)降低 docker 的版本;(2)如果不想降低 docker 版本,那么就更新 containerd.io 的版本:

wget https://download.docker.com/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
yum install -y  containerd.io-1.2.6-3.3.el7.x86_64.rpm

然后重新執(zhí)行:

yum install docker-ce docker-ce-cli containerd.io

5、啟動(dòng) docker。

systemctl start docker

6、查看是否安裝成功。

[root@eric ~]# docker version
Client: Docker Engine - Community
 Version:           19.03.13
 API version:       1.40
 Go version:        go1.13.15
 Git commit:        4484c46d9d
 Built:             Wed Sep 16 17:03:45 2020
 OS/Arch:           linux/amd64
 Experimental:      false
 ...

顯示 docker 的版本信息則說(shuō)明 docker 安裝成功。

7、配置阿里云。

Docker入門(mén)詳細(xì)介紹

把上述的代碼直接一步一步執(zhí)行即可。

8、測(cè)試運(yùn)行 hello-world。

第一次運(yùn)行會(huì)自動(dòng)從鏡像倉(cāng)庫(kù)中拉取最新鏡像,然后再運(yùn)行鏡像。

docker run hello-world

等待出現(xiàn)以下內(nèi)容,說(shuō)明 hello-world 鏡像拉取并運(yùn)行成功。

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

Docker 中 run 命令運(yùn)行的原理:

Docker入門(mén)詳細(xì)介紹

run命令運(yùn)行原理

9、查看當(dāng)前 Docker 中下載的鏡像信息。

?  ~ docker images         
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
hello-world           latest              bf756fb1ae65        4 months ago        13.3kB

卸載 Docker(除非不用,否則干嘛要卸載呢):

#1. 卸載依賴(lài)yum remove docker-ce docker-ce-cli containerd.io#2. 刪除資源rm -rf /var/lib/docker # /var/lib/docker 是 docker 的默認(rèn)工作路徑!

Docker 常用命令

Docker 中的命令有很多,也不可能全部記完,還是像學(xué)習(xí) Linux 命令一樣,只要多練習(xí)實(shí)踐,就能夠快速掌握。另外,只要 Linux 玩得好,那么 Docker 這一塊怎么玩都不會(huì)錯(cuò)。

Docker 命令官方文檔:https://docs.docker.com/reference/,這里整理一下常用的命令。

幫助命令

docker version   # 顯示docker的版本信息

docker info      # 顯示docker的系統(tǒng)信息,包括鏡像和容器的數(shù)量

docker --help    # 幫助命令

鏡像命令

docker images   #查看所有本地主機(jī)上的鏡像 可以使用docker image ls代替

docker search   #搜索鏡像

docker pull     #下載鏡像

docker rmi      #刪除鏡像

下面對(duì)這幾個(gè)命令詳細(xì)說(shuō)明一下。

docker images 查看所有本地的主機(jī)上的鏡像」

?  ~ docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
mysql                 5.7                 e73346bdf465        24 hours ago        448MB

解釋?zhuān)?/p>

REPOSITORY  # 鏡像的倉(cāng)庫(kù)源
TAG         # 鏡像的標(biāo)簽
IMAGE ID    # 鏡像的id
CREATED     # 鏡像的創(chuàng)建時(shí)間
SIZE        # 鏡像的大小

docker images 命令的可選項(xiàng):

Options:
  -a, --all             Show all images (default hides intermediate images)  #列出所有鏡像
  -q, --quiet           Only show numeric IDs  # 只顯示鏡像的id

例如:

?  ~ docker images -aq  # 顯示所有鏡像的id
e73346bdf465

docker search 搜索鏡像」

通常我們會(huì)在 DockerHub 官網(wǎng)中進(jìn)行搜索相應(yīng)的鏡像,如下:

Docker入門(mén)詳細(xì)介紹

官網(wǎng)搜索鏡像

但是我們也可以在 Docker 命令行中進(jìn)行鏡像搜索,例如:

[root@eric ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                             MySQL is a widely used, open-source relation??  10202               [OK]                
mariadb                           MariaDB is a community-developed fork of MyS??  3753                [OK]                
mysql/mysql-server                Optimized MySQL Server Docker images. Create??  746                                     [OK]
percona                           Percona Server is a fork of the MySQL relati??  511                 [OK]

docker search 命令后也可以加可選項(xiàng):

Options:
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print search using a Go template
      --limit int       Max number of search results (default 25)
      --no-trunc        Don't truncate output

例如我們對(duì)搜索的結(jié)果進(jìn)行一定的過(guò)濾:

# --filter=STARS=5000 表示搜索出來(lái)的鏡像就是 STARS 大于 5000 的      ?  ~ docker search mysql --filter=STARS=5000
NAME                DESCRIPTION                                     STARS               OFFICIAL  
mysql               MySQL is a widely used, open-source relation…   9500                [OK]

docker pull 下載鏡像」

下載鏡像:docker pull 鏡像名[:tag],例如我們下載 tomcat 8,命令如下:

?  ~ docker pull tomcat:8     # 如果不寫(xiě)tag,默認(rèn)就是latest
8: Pulling from library/tomcat
90fe46dd8199: Already exists   #分層下載:docker image 的核心 聯(lián)合文件系統(tǒng)
35a4f1977689: Already exists 
bbc37f14aded: Already exists 
74e27dc593d4: Already exists 
93a01fbfad7f: Already exists 
1478df405869: Pull complete 
64f0dd11682b: Pull complete 
68ff4e050d11: Pull complete 
f576086003cf: Pull complete 
3b72593ce10e: Pull complete 
Digest: sha256:0c6234e7ec9d10ab32c06423ab829b32e3183ba5bf2620ee66de866df640a027  # 簽名 防偽
Status: Downloaded newer image for tomcat:8
docker.io/library/tomcat:8 #真實(shí)地址#指定版本下載 MySQL,如?  ~ docker pull mysql:5.7

docker rmi 刪除鏡像」

?  ~ docker rmi -f 鏡像id                      # 刪除指定的鏡像
?  ~ docker rmi -f 鏡像id 鏡像id 鏡像id 鏡像id  # 刪除指定的多個(gè)鏡像
?  ~ docker rmi -f $(docker images -aq)        # 刪除全部的鏡像 $()為傳入?yún)?shù)

容器命令

容器就是運(yùn)行起來(lái)的鏡像。

docker pull 名稱(chēng)[:tag] # 拉取鏡像,有了鏡像才可以創(chuàng)建出容器

docker run 鏡像        # 新建容器并啟動(dòng),此時(shí)會(huì)新鍵容器

docker ps              # 列出所有運(yùn)行的容器
docker ps -a           # 列出所有的容器(包含歷史)

docker rm 容器id        # 刪除指定id的容器,注意和 rmi 的區(qū)別

docker start 容器id     # 啟動(dòng)容器,根據(jù)容器 id 來(lái)運(yùn)行,此時(shí)不會(huì)新鍵容器
docker restart 容器id   # 重啟容器
docker stop 容器id      # 停止當(dāng)前正在運(yùn)行的容器
docker kill 容器id      # 強(qiáng)制停止當(dāng)前容器

「運(yùn)行容器」

使用命令 docker run 鏡像 命令來(lái)運(yùn)行容器,此命令的可選項(xiàng)有:

--name="Name" # 容器名字 tomcat01 tomcat02 用來(lái)區(qū)分容器
-d    # 后臺(tái)方式運(yùn)行
-it    # 使用交互方式運(yùn)行,進(jìn)入容器查看內(nèi)容
-p            # 指定容器的端口 -p 8080(宿主機(jī)):8080(容器)
-P(大寫(xiě))      #隨機(jī)指定端口

例如這里寫(xiě)個(gè)測(cè)試,啟動(dòng) msyql 鏡像并進(jìn)入容器,使用 bash:

[root@eric ~]# docker run -it mysql /bin/bash# 注意此時(shí)已經(jīng)進(jìn)入容器內(nèi)部,觀察主機(jī)名稱(chēng)的改變r(jià)oot@6849133331da:/# ls
bin  boot  dev docker-entrypoint-initdb.d  entrypoint.sh  etc home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var# 進(jìn)入 MySQL 數(shù)據(jù)庫(kù)中root@6849133331da:/# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.32 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.# 此時(shí)進(jìn)入我們 Docker 中的數(shù)據(jù)庫(kù),和本地操作是一模一樣的mysql> show databases;+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)# 退出數(shù)據(jù)庫(kù)mysql> exitBye# 退出 mysql 容器root@6849133331da:/# exit
exit# 查看運(yùn)行的容器[root@eric ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
6849133331da        mysql:5.7           "docker-entrypoint.s??   11 days ago         Up About a minute   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql01# 停止運(yùn)行容器[root@eric ~]# docker stop 6849133331da
docker6849133331da
[root@eric ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@eric ~]#

有的容器退出后就會(huì)自動(dòng)停止運(yùn)行,如 centos,如果想容器不停止退出,則可以使用按鍵:ctrl + P + Q 。

對(duì)于上述在容器中運(yùn)行的數(shù)據(jù)庫(kù),如果我們想要在外部連接使用,那該怎么辦呢?很簡(jiǎn)單,只要我們把其端口映射出來(lái)就可以了,在我們運(yùn)行數(shù)據(jù)庫(kù)時(shí),可以這樣使用命令:docker run -d -p 3306:3306 mysql,它就表示后臺(tái)運(yùn)行 MySQL 數(shù)據(jù)庫(kù),并把其端口映射到服務(wù)器中,然后我們開(kāi)啟服務(wù)器防火墻相對(duì)應(yīng)的 3306 端口以及阿里云安全組 3306 端口后,就可以使用公網(wǎng)地址和端口號(hào)連接我們 Docker 容器中的數(shù)據(jù)庫(kù)了。例如我的:

Docker入門(mén)詳細(xì)介紹

連接Docker數(shù)據(jù)庫(kù)

「列舉容器」

docker ps    # 列舉當(dāng)前正在運(yùn)行的容器

docker ps -a # 列舉所有運(yùn)行過(guò)的容器

「退出容器」

exit          # 容器停止并退出
ctrl + P + Q  # 容器不停止退出

「刪除容器」

docker rm 容器id    # 刪除指定的容器,不能刪除正在運(yùn)行的容器,如果要強(qiáng)制刪除 rm -rf
docker rm -f 容器id 或 $(docker ps -aq)  # 刪除指定的容器或全部刪除(包括歷史信息)
docker ps -a -q|xargs docker rm         # 刪除所有的容器

「啟動(dòng)和停止容器的操作」

docker start 容器id #啟動(dòng)容器
docker restart 容器id #重啟容器
docker stop 容器id #停止當(dāng)前正在運(yùn)行的容器
docker kill 容器id #強(qiáng)制停止當(dāng)前容器

其他命令

「后臺(tái)啟動(dòng)命令」

有時(shí)候我們想要容器在后臺(tái)啟動(dòng),例如我們想要在后臺(tái)運(yùn)行一個(gè) centos 容器,那這個(gè)時(shí)候就用到了如下命令:

# 命令 docker run -d 鏡像名?  ~ docker run -d centos
a8f922c255859622ac45ce3a535b7a0e8253329be4756ed6e32265d2dd2fac6c

此時(shí)我們來(lái)查看正在運(yùn)行的容器:

?  ~ docker ps           
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

發(fā)現(xiàn)并沒(méi)有容器正在運(yùn)行,centos 停止了。這是一個(gè)常見(jiàn)的坑,docker 容器使用后臺(tái)運(yùn)行,就必須要有一個(gè)前臺(tái)進(jìn)程,docker 發(fā)現(xiàn)沒(méi)有應(yīng)用,就會(huì)自動(dòng)停止。比如 docker 中安裝了 nginx,容器啟動(dòng)后,發(fā)現(xiàn)自己沒(méi)有提供服務(wù),就會(huì)立刻停止,就是沒(méi)有程序了。

「查看日志」

使用 docker logs 命令,可選項(xiàng)有:

docker logs --help
Options:
      --details        Show extra details provided to logs 
*  -f, --follow         Follow log output
      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
*      --tail string    Number of lines to show from the end of the logs (default "all")
*  -t, --timestamps     Show timestamps
      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)

顯示日志:

docker logs -t --tail n 容器id  # 查看 n 行日志
docker logs -ft 容器id          # 跟著日志

「查看容器中進(jìn)程信息」

docker top 容器id

「查看鏡像的元數(shù)據(jù)」

比較重要的命令,可以查看容器的詳細(xì)信息。

docker inspect 容器id

「進(jìn)入當(dāng)前正在運(yùn)行的容器」

我們通常都是使用后臺(tái)方式運(yùn)行容器的,但是有些時(shí)候需要進(jìn)入容器,修改一些配置,進(jìn)入容器的方式有兩種:

# 方式1:docker exec -it 容器id bashshell# 方式2:docker attach 容器id

兩種方式的區(qū)別:

docker exec   # 進(jìn)入當(dāng)前容器后開(kāi)啟一個(gè)新的終端,可以在里面操作。(常用)
docker attach # 進(jìn)入容器正在執(zhí)行的終端

測(cè)試:

?  ~ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS      
55321bcae33d        centos              "/bin/sh -c 'while t…"   10 minutes ago      Up 10 minutes# 測(cè)試 exec 方式進(jìn)入在后臺(tái)運(yùn)行的容器,使用 bash 進(jìn)行交互?  ~ docker exec -it 55321bcae33d /bin/bash
[root@55321bcae33d /]# # 測(cè)試 attach 方式?  ~ docker attach 55321bcae33d 
當(dāng)前正在的代碼...

「拷貝容器內(nèi)文件到宿主機(jī)」

拷貝命令:

docker cp 容器id:容器內(nèi)路徑  宿主機(jī)目的路徑

測(cè)試:

#進(jìn)入docker容器內(nèi)部?  ~ docker exec -it  55321bcae33d /bin/bash 
[root@55321bcae33d /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr#新建一個(gè)文件[root@55321bcae33d /]# echo "hello" > test.java
[root@55321bcae33d /]# cat test.java 
hello
[root@55321bcae33d /]# exit
exit
?  ~ docker cp 55321bcae33d:/test.java /    #拷貝到宿主機(jī) / 目錄下
?  ~ cd /              
?  / ls   # 可以看見(jiàn) test.java 確實(shí)存在
bin   home         lib     mnt   run      sys  
...
etc   test.java    media   root  swapfile  var

總結(jié)

本文為 Docker 的入門(mén)文章,從為什么選擇 Docker 也即 Docker 的優(yōu)勢(shì)說(shuō)起,然后描述了 Docker 中的幾個(gè)相關(guān)術(shù)語(yǔ)——鏡像、容器、鏡像倉(cāng)庫(kù)。緊接著就向大家介紹了 Docker 的安裝與卸載,最后比較重要的是掌握 Docker 中常用的一些命令。

到此,相信大家對(duì)“Docker入門(mén)詳細(xì)介紹”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI