【現(xiàn)學(xué)現(xiàn)忘Docker基礎(chǔ)】— 15.練習(xí):Docker安裝Nginx

步驟1:搜索鏡像

使用docker search命令進(jìn)行搜索。


建議大家去Docker官方鏡像倉庫去搜索,地址https://hub.docker.com/,可以看到詳細(xì)的幫助文檔,和鏡像的倉庫源所支持的版本。

步驟2:下載Nginx鏡像

使用docker pull命令,從Docker鏡像庫中拉取鏡像。

[root@192 ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a076a628af6f: Already exists 
0732ab25fa22: Already exists 
d7f36f6fe38f: Already exists 
f72584a26f32: Already exists 
7125e4df9063: Already exists 
Digest: sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aa
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

[root@192 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    f6d0b4767a6c   2 months ago   133MB
centos       latest    300e315adb2f   3 months ago   209MB

步驟3:運(yùn)行Nginx鏡像

執(zhí)行命令:docker run -d --name nginx-01 -p 8888:80 nginx,啟動Nginx鏡像。

-d:后臺運(yùn)行容器。
--name:給容器命名。
-p 宿主機(jī)端口:容器內(nèi)部端口:配置Docker容器端口暴露,使外界能夠訪問Docker容器內(nèi)部。通過宿主機(jī)的8888端口就可以訪問容器的80端口的服務(wù)。

[root@192 ~]# docker run -d --name nginx-01 -p 8888:80 nginx
b82175d577fd4fc010f7ecf1ca544f3a8a52d8e0d83d3629eab24efb042ce12c

查看宿主機(jī)正在運(yùn)行的容器


拓展:

Docker容器端口暴露是什么?

端口暴露就是配置Docker容器的端口映射。

端口映射本質(zhì):Docker通過容器綁定主機(jī)系統(tǒng)的端口, 允許非本地客戶端訪問容器內(nèi)部運(yùn)行的服務(wù)。

我們先看下面一張圖:


說明:運(yùn)行容器為什么要使用端口映射?

默認(rèn)情況下,容器使用的IP是172.17.0.0/16網(wǎng)段的,外界的用戶只能訪問宿主機(jī)的192.168.134.129網(wǎng)段,而無法訪問172.17.0.0/16網(wǎng)段。

我們運(yùn)行容器的目的:是希望運(yùn)行在容器中的服務(wù),能夠被外界訪問,這里就涉及到了外網(wǎng)192.168.134.129網(wǎng)段到容器內(nèi)網(wǎng)172.17.0.0/16網(wǎng)段的轉(zhuǎn)換,所以需要做端口映射。

端口映射是 Docker 比較重要的一個功能,原因在于我們每次運(yùn)行容器的時候容器的IP地址不能指定而是在橋接網(wǎng)卡的地址范圍內(nèi)隨機(jī)生成的。

宿主機(jī)器的IP地址是固定的,我們可以將容器的端口的映射到宿主機(jī)器上的一個端口,免去每次訪問容器中的某個服務(wù)時都要查看容器的IP的地址。

Docker運(yùn)行容器端口映射的方法:

指定映射(Docker自動添加一條iptables規(guī)則實現(xiàn)端口映射)
    -p hostPort:containerPort(常用)
    -p ip:hostPort:containerPort 
    -p ip::containerPort(隨機(jī)端口)
    -p hostPort:containerPort:udp

同時可以指定多個映射端口:
    -p 81:80 -p 443:443 

隨機(jī)映射
    docker run -P (隨機(jī)端口)

通過Docker容器端口映射之后,外網(wǎng)就能夠訪問容器內(nèi)部的服務(wù)了。

提示:-p 81:80, 后邊的端口是容器中服務(wù)的端口,容器中的服務(wù)比如是Nginx,默認(rèn)的端口是80,所以:后邊的位置是80,如果修改Nginx的默認(rèn)端口為8888,則命令中要寫成-p 81:8888。
也就是容器中服務(wù)的端口號,要和冒號后邊的端口號對應(yīng)。

我們就先簡單的說這么多,關(guān)于Docker容器網(wǎng)絡(luò)方面,以后會詳細(xì)說明。

步驟4:進(jìn)行本機(jī)測試

就是在宿主機(jī)本機(jī)上,直接訪問容器內(nèi)部。最后我們在測試外網(wǎng)訪問宿主機(jī)內(nèi)的容器的。(因為我是在虛擬機(jī)上開啟的Docker,這個虛擬機(jī)就是本機(jī),我的本地電腦就可以是外網(wǎng)主機(jī)。)

我們需要使用curl命令實現(xiàn)。

curl命令是Linux系統(tǒng)中常用的命令行工具,用來請求 Web 服務(wù)器。它的名字就是客戶端(client)的 URL 工具的意思。

使用方式:curl https://www.baidu.com。

宿主機(jī)訪問本機(jī)容器命令:curl localhost:8888

[root@192 ~]# curl localhost:8888
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a >nginx.org</a>.<br/>
Commercial support is available at
<a >nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

可以看到返回的是一個HTML頁面,頁面中有Welcome to nginx!,說明Nginx正常啟動。

步驟5:進(jìn)入容器內(nèi)進(jìn)行操作

上面測試Nginx服務(wù)正常啟動,我們就可以進(jìn)入到Nginx中進(jìn)行操作。

執(zhí)行命令進(jìn)入Nginx容器:docker exec -it nginx-01 /bin/bash

[root@192 ~]# docker exec -it nginx-01 /bin/bash
root@b82175d577fd:/# 

比如我們修改Nginx服務(wù)的歡迎界面。

# 1.查看nginx相關(guān)文件的位置
root@b82175d577fd:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx

# 2. 查看nginx服務(wù)歡迎界面的位置
root@b82175d577fd:/# cat /usr/share/nginx/html/index.html 
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a >nginx.org</a>.<br/>
Commercial support is available at
<a >nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

# 修改nginx服務(wù)歡迎界面
root@b82175d577fd:/# vim /usr/share/nginx/html/index.html
# 在Welcome to nginx!后加入hello docker
# 修改nginx服務(wù)的歡迎界面不用重啟服務(wù)。
# 具體效果,下一步驗證。

提示:Docker容器中沒有vi編輯器的解決辦法。

如果容器中沒有vi編輯器,可以使用apt-get命令安裝。

命令如下:apt-get install vim

可以出現(xiàn)的錯誤如下:

(1)如果進(jìn)入容器時沒有指定root用戶,則可能會報錯

E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?

解決方式:

  1. exit退出容器,指定root用戶進(jìn)入容器
  2. 命令: docker exec -it --user root b82175d577fd/bin/bash

(我們自己練習(xí)時一般默認(rèn)都是root用戶登陸,如上練習(xí)中的root@b82175d577fd:/#

(2)如果之前沒有執(zhí)行apt-get update這個命令,可能會報錯

root@b82175d577fd:/# apt-get install vim
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package vim

解決:

  1. 先執(zhí)行命令:apt-get update
  2. 然后執(zhí)行:apt-get install vim

(一般都是這種問題)

步驟6:測試外網(wǎng)訪問容器

先查看Linux虛擬機(jī)的IP地址

[root@192 ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:77ff:feae:1e74  prefixlen 64  scopeid 0x20<link>
        ether 02:42:77:ae:1e:74  txqueuelen 0  (Ethernet)
        RX packets 6  bytes 1146 (1.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 13  bytes 1036 (1.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.134.129  netmask 255.255.255.0  broadcast 192.168.134.255
        inet6 fe80::9211:a5e0:21ca:ae99  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:43:c5:a0  txqueuelen 1000  (Ethernet)
        RX packets 1215  bytes 158212 (154.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 691  bytes 84321 (82.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
...# 省略

Linux虛擬機(jī)的IP地址為:192.168.134.129

在瀏覽器中訪問http://192.168.134.129:8888/,我們同樣可以訪問Nginx容器,如下:

同時也可以看到,我們第5步修改的內(nèi)容已經(jīng)成功了。

這篇文章就是一個小練習(xí),拓展一下我們的思路。

思考問題:我們每次改動Nginx配置文件,都需要進(jìn)入容器內(nèi)部,十分的麻煩。是否可以在容器外部提供一個映射路徑,使我們能夠在容器外部修改文件,容器內(nèi)部可以自動修改呢?

可以,使用-v數(shù)據(jù)卷,之后會詳細(xì)說明。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容