[toc]
步驟1:搜尋映象
使用docker search
命令進行搜尋。
建議大家去Docker官方映象倉庫去搜尋,地址https://hub.docker.com/,可以看到詳細的幫助文件,和映象的倉庫源所支援的版本。
步驟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:執行Nginx映象
執行命令:docker run -d --name nginx-01 -p 8888:80 nginx
,啟動Nginx映象。
-d
:後臺執行容器。
--name
:給容器命名。
-p 宿主機埠:容器內部埠
:配置Docker容器埠暴露,使外界能夠訪問Docker容器內部。通過宿主機的8888埠就可以訪問容器的80埠的服務。
[root@192 ~]# docker run -d --name nginx-01 -p 8888:80 nginx
b82175d577fd4fc010f7ecf1ca544f3a8a52d8e0d83d3629eab24efb042ce12c
檢視宿主機正在執行的容器。
擴充:
Docker容器埠暴露是什麼?
埠暴露就是配置Docker容器的埠對映。
埠對映本質:Docker通過容器繫結主機系統的埠, 允許非本地客戶端訪問容器內部執行的服務。
我們先看下面一張圖:
說明:執行容器為什麼要使用埠對映?
預設情況下,容器使用的IP是172.17.0.0/16
網段的,外界的使用者只能訪問宿主機的192.168.134.129
網段,而無法訪問172.17.0.0/16
網段。
我們執行容器的目的:是希望執行在容器中的服務,能夠被外界訪問,這裡就涉及到了外網192.168.134.129
網段到容器內網172.17.0.0/16
網段的轉換,所以需要做埠對映。
埠對映是 Docker 比較重要的一個功能,原因在於我們每次執行容器的時候容器的IP地址不能指定而是在橋接網路卡的地址範圍內隨機生成的。
宿主機器的IP地址是固定的,我們可以將容器的埠的對映到宿主機器上的一個埠,免去每次訪問容器中的某個服務時都要檢視容器的IP的地址。
Docker執行容器埠對映的方法:
指定對映(Docker自動新增一條iptables規則實現埠對映)
-p hostPort:containerPort(常用)
-p ip:hostPort:containerPort
-p ip::containerPort(隨機埠)
-p hostPort:containerPort:udp
同時可以指定多個對映埠:
-p 81:80 -p 443:443
隨機對映
docker run -P (隨機埠)
通過Docker容器埠對映之後,外網就能夠訪問容器內部的服務了。
提示:
-p 81:80
, 後邊的埠是容器中服務的埠,容器中的服務比如是Nginx,預設的埠是80
,所以:後邊的位置是80
,如果修改Nginx的預設埠為8888
,則命令中要寫成-p 81:8888
。也就是容器中服務的埠號,要和冒號後邊的埠號對應。
我們就先簡單的說這麼多,關於Docker容器網路方面,以後會詳細說明。
步驟4:進行本機測試
就是在宿主機本機上,直接訪問容器內部。最後我們在測試外網訪問宿主機內的容器的。(因為我是在虛擬機器上開啟的Docker,這個虛擬機器就是本機,我的本地電腦就可以是外網主機。)
我們需要使用curl
命令實現。
curl
命令是Linux系統中常用的命令列工具,用來請求 Web 伺服器。它的名字就是客戶端(client)的 URL 工具的意思。
使用方式:curl https://www.baidu.com
。
宿主機訪問本機容器命令: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 href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
可以看到返回的是一個HTML頁面,頁面中有Welcome to nginx!
,說明Nginx正常啟動。
步驟5:進入容器內操作
上面測試Nginx服務正常啟動,我們就可以進入到Nginx中進行操作。
執行命令進入Nginx容器:docker exec -it nginx-01 /bin/bash
[root@192 ~]# docker exec -it nginx-01 /bin/bash
root@b82175d577fd:/#
比如我們修改Nginx服務的歡迎介面。
# 1.檢視nginx相關檔案的位置
root@b82175d577fd:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
# 2. 檢視nginx服務歡迎介面的位置
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 href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
# 修改nginx服務歡迎介面
root@b82175d577fd:/# vim /usr/share/nginx/html/index.html
# 在Welcome to nginx!後加入hello docker
# 修改nginx服務的歡迎介面不用重啟服務。
# 具體效果,下一步驗證。
提示:Docker容器中沒有vi編輯器的解決辦法。
如果容器中沒有vi編輯器,可以使用apt-ge
t命令安裝。
命令如下:apt-get install vim
可以出現的錯誤如下:
(1)如果進入容器時沒有指定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?
解決方式:
exit
退出容器,指定root
使用者進入容器- 命令:
docker exec -it --user root b82175d577fd/bin/bash
(我們自己練習時一般預設都是root
使用者登陸,如上練習中的root@b82175d577fd:/#
)
(2)如果之前沒有執行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
解決:
- 先執行命令:
apt-get update
- 然後執行:
apt-get install vim
(一般都是這種問題)
步驟6:測試外網訪問容器
先檢視Linux虛擬機器的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虛擬機器的IP地址為:192.168.134.129
在瀏覽器中訪問http://192.168.134.129:8888/
,我們同樣可以訪問Nginx容器,如下:
同時也可以看到,我們第5步修改的內容已經成功了。
這篇文章就是一個小練習,擴充一下我們的思路。
思考問題:我們每次改動Nginx配置檔案,都需要進入容器內部,十分的麻煩。是否可以在容器外部提供一個對映路徑,使我們能夠在容器外部修改檔案,容器內部可以自動修改呢?
可以,使用
-v
資料卷,之後會詳細說明。