步驟1:為我們的容器創(chuàng)建第一個(gè)鏡像
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括頭屯河網(wǎng)站建設(shè)、頭屯河網(wǎng)站制作、頭屯河網(wǎng)頁(yè)制作以及頭屯河網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,頭屯河網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到頭屯河省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
# 以 centos 鏡像作為基礎(chǔ)鏡像,我們啟動(dòng)自己的容器并在其中執(zhí)行/bin/bash命令
# 注:-t -i 參數(shù)用于創(chuàng)建一個(gè)虛擬的命令行。
sudo docker run -t -i centos /bin/bash
現(xiàn)在我們已經(jīng)成功的運(yùn)行了自己的第一個(gè)容器,并且進(jìn)入到容器的命令行界面中。在容器中,我們執(zhí)行下面的命令:
yum -y update # 更新軟件包
yum install which # 安裝which命令
yum install git # 安裝Git
安裝完成后,按 Ctrl + d 來(lái)退出容器的命令行。
# 執(zhí)行sudo docker ps -a,可以看到被我們終止的容器
CONTAINER ID IMAGE COMMAND CREATED……
da9031d3568f centos:6.4 /bin/bash 5 minutes ago…..
把我們所做的改變提交到一個(gè)新的容器:
# 這里我們創(chuàng)建一個(gè)自己的基礎(chǔ)容器,容器中安裝好了文章中所需的常用工具。讀者的容器 id 可能與文章中的有所不同,以上一步 docker ps -a 的結(jié)果為準(zhǔn)。
sudo docker commit da90 custom/base
容器成功提交后,執(zhí)行 sudo docker images ,我們會(huì)看到剛才提交的容器(如下面的結(jié)果所示)。我們就以這個(gè)容器為基礎(chǔ)容器,再來(lái)創(chuàng)建一個(gè)新的容器。
REPOSITORY TAG IMAGE ID CREATED
custom/base latest 05b6cecd370b 2 minutes ago
centos 6.4 539c0211cd76 10 months ago
centos latest 539c0211cd76 10 months ago…
步驟2:創(chuàng)建新的容器,并安裝 apache
# 以 custom/base 容器為基礎(chǔ),運(yùn)行一個(gè)新的容器。
sudo docker run -t -i custom/base /bin/bash
# 安裝 httpd
yum install httpd
步驟3:再次提交新的容器
按 Ctrl + d 來(lái)退出容器的命令行,然后執(zhí)行命令:
# 這個(gè)命令會(huì)把步驟2中我們安裝 httpd 帶來(lái)的改變提交到新的名為 custom/httpd 的容器鏡像中。你的容器 id 可能會(huì)和文章中有所不同,以 sudo docker ps -a 命令的結(jié)果為準(zhǔn)。
sudo docker commit aa6e2fc0b94c custom/httpd
你應(yīng)該已經(jīng)發(fā)現(xiàn)了,我們創(chuàng)建了一個(gè)帶有 http 服務(wù)器并可以復(fù)用的容器鏡像。你可以根據(jù)這種思想,為自己所需的每個(gè)組件都創(chuàng)建一個(gè)容器,然后把這些容器復(fù)用于開發(fā)環(huán)境或者生產(chǎn)環(huán)境。
步驟7:運(yùn)行 http 服務(wù)器
# -v will Mount a volume from VM to the container which was also shared from host to Vagrant VM.
# -v 參數(shù)把主機(jī)共享給虛擬機(jī)的一個(gè)卷掛載到容器中
# -p forward VM port 80 to container port 80; VM port 80 is mapped to host port 8080 in Vagrantfile
# -p 參數(shù)把虛擬機(jī)的80端口映射到容器的80端口;虛擬機(jī)的80端口在 Vagrantfile 中被綁定到主機(jī)的8080端口,也就是:主機(jī)8080-虛擬機(jī)80-容器80
sudo docker run -t -i -p 80:80 -v /vagrant/htdocs:/var/www/html custom/httpd /bin/bash
# 啟動(dòng) Apache
apachectl -k start
當(dāng)前Ubuntu 系統(tǒng)下的 Docker 的安裝包只提供64位。如果你想運(yùn)行32位的 Docker,你需要。
安裝 Docker
通過(guò) apt-get 安裝 Docker 簡(jiǎn)直是小菜一碟。
$ sudo apt-get install docker.io
如果你不是 root 組的用戶,你可以把自己加入到 docker 用戶組。下面的命令可以讓沒有 root 權(quán)限的用戶使用 Docker:
$ sudo usermod -a -G docker $USER
重新登錄,以便讓你的用戶組權(quán)限生效。
下一步是編輯 Docker 配置文件,確定 Docker 可執(zhí)行文件的路徑:
$ sudo vi /etc/default/docker.io
DOCKER= /usr/bin/docker.io
重啟 Docker 服務(wù):
$ sudo service docker.io restart
管理 Docker Container 容器
如果你想在新的 Docker 容器下創(chuàng)建一個(gè)新的 Ubuntu 操作系統(tǒng),你首先需要 pull 一個(gè) 的 Docker 鏡像。下面的命令可以通過(guò)網(wǎng)絡(luò)下載 Docker 鏡像:
$ docker pull ubuntu
你可以使用下面的命令啟動(dòng) Docker 里面的 Ubuntu 系統(tǒng)。最后的參數(shù) /bin/bash 表示一旦容器啟動(dòng),首先會(huì)執(zhí)行簡(jiǎn)單的 bash。
$ docker run -i -t ubuntu /bin/bash
上面的命令會(huì)立即啟動(dòng) Ubuntu container 容器(這是一個(gè)完美的容器!),然后它會(huì)提供一個(gè) shell 提示符運(yùn)行環(huán)境給你。現(xiàn)在開始你可以通過(guò)這個(gè)沙箱環(huán)境訪問(wèn)一個(gè)完整的 Ubuntu 系統(tǒng)了。
輸入 exit 命令退出 Docker 容器。
你也可以用下面的命令進(jìn)入不同的系統(tǒng)。比如 Fedora:
$ docker.io run -i -t fedora /bin/bash
如果系統(tǒng)中還不存在 Fedora Docker 鏡像,這個(gè)命令會(huì)自動(dòng)下載它,然后啟動(dòng)這個(gè) Fedora 的 Docker 容器。
如果你想要開啟指定版本的系統(tǒng),比如 Ubuntu 13.04,你可以使用下面的命令:
$ docker.io run -i -t ubuntu:13.04 /bin/bash
Container 容器網(wǎng)絡(luò)設(shè)置
Docker 使用 Linux 橋接技術(shù)與其他容器通信,以及連通外網(wǎng)。安裝完 Docker 后你應(yīng)該可以看到 docker0 這個(gè)網(wǎng)橋,這是 Docker 默認(rèn)創(chuàng)建的。你創(chuàng)建的每個(gè)容器都會(huì)通過(guò)這個(gè)網(wǎng)橋連接到網(wǎng)絡(luò)。
自定義 Linux 網(wǎng)橋
如果你想自定義網(wǎng)橋,你可以執(zhí)行以下步驟。你可以在這個(gè)網(wǎng)橋后面分配一個(gè)子網(wǎng),并為這個(gè)子網(wǎng)分配地址。下面的命令會(huì)為 Docker 子網(wǎng)分配 10.0.0.0/24 地址段:
$ sudo apt-get install bridge-utils
$ sudo brctl addbr br0
$ sudo ifconfig br0 10.0.0.1 netmask 255.255.255.0
然后在 /etc/default/docker.io 文件的 DOCKER_OPTS 變量里添加 -b=br0 選項(xiàng),并重啟 Docker 服務(wù):
$ sudo service docker.io restart
到目前為止,任何創(chuàng)建的容器都會(huì)連上 br0 網(wǎng)橋,它們的 IP 地址會(huì)從 10.0.0.0/24 中自動(dòng)分配(譯注:在10.0.0.2到10.0.0.254之間隨機(jī)分配)。
其他自定義設(shè)置
你可以通過(guò) /etc/default/docker.io 文件的 DOCKER_OPTS 變量設(shè)置其他一些屬性:
-dns 8.8.8.8 -dns 8.8.4.4 : 為容器指定 DNS 服務(wù)器。
-icc=false : 將容器與其他容器隔離出來(lái)
疑難解答
1、當(dāng)你運(yùn)行 docker.io 命令時(shí),你可能會(huì)遇到以下問(wèn)題:
dial unix /var/run/docker.sock: no such file or directory
這個(gè)錯(cuò)誤可能是由于 Docker 后臺(tái)進(jìn)程沒有啟動(dòng)。檢查下 Docker 后臺(tái)進(jìn)程的狀態(tài),確認(rèn)它已經(jīng)處于啟動(dòng)狀態(tài):
$ sudo service docker.io status$ sudo service docker.io start
Docker中我們一般會(huì)有兩種執(zhí)行命令的方式,一種是直接進(jìn)入容器的命令行,在終端執(zhí)行并查看結(jié)果,一種是在后臺(tái)執(zhí)行,并不會(huì)在終端查看結(jié)果。
1、進(jìn)入容器命令行
su root
docker run -i -t ubuntu:16.04/bin/bash#或者執(zhí)行下面這句docker run -it ubuntu:16.04/bin/bash
-i和-t的作用是幫助你進(jìn)入交互模式,如果不加這部分,你將無(wú)法進(jìn)入容器內(nèi)部,更別說(shuō)使用命令行了。/bin/bash的意思就是使用容器的命令行來(lái)輸入命令。執(zhí)行結(jié)果如下:
root@7d150a0fb029:/#
root后面跟的就是容器id,表明你已經(jīng)進(jìn)入容器,可以輸入命令了,你可以輸入一些常用命令試試:
root@7d150a0fb029:/# docker run -i -t ubuntu:16.04 /bin/bash
結(jié)果輸出了鏡像的內(nèi)核版本信息:
Linux version 4.13.0-36-generic (buildd@lgw01-amd64-033)(gcc version 5.4.020160609(Ubuntu5.4.0-6ubuntu1~16.04.9))#40~16.04.1-Ubuntu SMP Fri Feb 16 23:25:58 UTC 2018
通過(guò)exit可退出容器。
2、后臺(tái)執(zhí)行命令
輸入下面的代碼,-d表示的就是后臺(tái)運(yùn)行,這點(diǎn)可以直接通過(guò)docker run –help查看該命令的功能。下面這句話的意思就是在鏡像的程序中添加引號(hào)內(nèi)的代碼,并在后臺(tái)運(yùn)行。
docker run -d ubuntu:16.04 /bin/sh -c "while true; do echo hello world; sleep 1;done"
輸出結(jié)果不會(huì)顯示運(yùn)行的結(jié)果,而是給出新建的容器id,這里說(shuō)明一下,每次輸入docker run命令都會(huì)新建一個(gè)容器,產(chǎn)生一個(gè)新的id。
輸出結(jié)果如下:
c7188be9bd7b5c0aa91c5eeb72013996c89bfdc2181d1a5ff7f880af6f8aff99
查看一下正在運(yùn)行的容器:
root@cdl-XPS15R:/home/cdl# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7188be9bd7b ubuntu:16.04"/bin/sh -c 'while t…"13 seconds ago Up11 seconds keen_vaughan1b6ba17f7df7 ubuntu:16.04"/bin/bash"2 minutes ago Exited(0)2 minutes ago cocky_noether7d150a0fb029 ubuntu:16.04"/bin/bash"4 minutes ago Exited(0)2 minutes ago hopeful_banach
這里會(huì)發(fā)現(xiàn),第一個(gè)容器的id和后臺(tái)運(yùn)行的容器id前幾位一模一樣,但是長(zhǎng)度要長(zhǎng)很多,其實(shí)是一樣的,只不過(guò)通過(guò)ps命令打印輸出時(shí)為了方便顯示只顯示了前幾位。
如果想要進(jìn)入后臺(tái)運(yùn)行的容器的命令行而不創(chuàng)建新的容器,只需要輸入以下命令:
#Exec是進(jìn)入已經(jīng)存在的容器,run是創(chuàng)建新容器docker Exec-it c7188be9bd7b /bin/bash
輸入哪個(gè)更長(zhǎng)的id也是一樣的效果:
docker Exec -it c7188be9bd7b5c0aa91c5eeb72013996c89bfdc2181d1a5ff7f880af6f8aff99 /bin/bash
輸出結(jié)果都是:
root@c7188be9bd7b:/#