Docker 是一個(gè)開(kāi)源的應(yīng)用容器引擎,基于 Go 語(yǔ)言 并遵從 Apache2.0 協(xié)議開(kāi)源。
Docker 可以讓開(kāi)發(fā)者打包他們的應(yīng)用以及依賴包到一個(gè)輕量級(jí)、可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實(shí)現(xiàn)虛擬化。
容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口(類似 iPhone 的 app),更重要的是容器性能開(kāi)銷極低。
Docker 從 17.03 版本之后分為 CE(Community Edition: 社區(qū)版) 和 EE(Enterprise Edition: 企業(yè)版)
目錄
- 一、安裝環(huán)境
- 二、Docker安裝
- 三、Docker基本使用
- 四、Docker安裝CentOS
- 五、Docker安裝MySQL
- 六、Docker安裝Tomcat
- 七、Docker GUI管理
- 八、參考并致謝
一、安裝環(huán)境
操作系統(tǒng):CentOS 7(建議用7或以上,因?yàn)?版本有部分功能不兼容)
二、Docker安裝
1、卸載舊版本
[root@bogon ~]# yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、安裝所需軟件包
[root@bogon ~]# yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
3、設(shè)置倉(cāng)庫(kù)
[root@bogon ~]# yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
4、安裝最新版本
[root@bogon ~]# yum install docker-ce docker-ce-cli containerd.io
如果不是安裝最新版本可以使用以下步驟:
查看可用版本:
[root@bogon ~]# yum list docker-ce --showduplicates | sort -r
然后使用命令安裝對(duì)應(yīng)得版本:
[root@bogon ~]# yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
-- 如:yum install docker-ce-18.09.1 docker-ce-cli-18.09.1 containerd.io
5、安裝完后啟動(dòng)
[root@bogon ~]# systemctl start docker
6、驗(yàn)證
[root@bogon ~]# docker run hello-world
root@0316378d2b63:/#
三、Docker基本使用
1、容器的使用
直接輸入docker命令可查看到docker命令的選項(xiàng)
啟動(dòng)容器
使用以下命令啟動(dòng)一個(gè)容器:
[root@bogon ~]# docker run -it ubuntu /bin/bash
參數(shù)說(shuō)明:
-i: 交互式操作。
-t: 終端。
ubuntu: ubuntu 鏡像。
/bin/bash:放在鏡像名后的是命令,這里我們希望有個(gè)交互式 Shell,因此用的是 /bin/bash。
如果需要退出則直接輸入exit命令即可
如果需要后臺(tái)運(yùn)行可加上-d參數(shù)
[root@bogon ~]# docker run -itd --name ubuntu-test ubuntu /bin/bash
其中,-name是指定容器的名字,名字可以自定義
查看所有容器
[root@bogon ~]# docker ps -a
啟動(dòng)、關(guān)閉、重啟一個(gè)已存在的容器
-- 啟動(dòng)
[root@bogon ~]# docker start <容器ID>
-- 停止
[root@bogon ~]# docker stop <容器ID>
-- 重啟
[root@bogon ~]# docker restart <容器ID>
進(jìn)入和退出在后臺(tái)運(yùn)行的容器
-- 進(jìn)入容器
[root@bogon ~]# docker attach <容器ID>
-- 退出容器且不關(guān)閉
[root@bogon ~]# docker exec
導(dǎo)入和導(dǎo)出容器
-- 導(dǎo)出
[root@bogon ~]# docker export <容器ID> > 導(dǎo)出路徑
如:docker export 1e560fca3906 > ubuntu.tar
-- 導(dǎo)入
[root@bogon ~]# cat 路徑 | docker import - 鏡像名:標(biāo)簽名
如:cat docker/ubuntu.tar | docker import - test/ubuntu:v1
刪除容器
[root@bogon ~]# docker rm -f <容器ID>
清空所有處于終止?fàn)顟B(tài)的容器:
[root@bogon ~]# docker container prune
使用容器運(yùn)行一個(gè)web應(yīng)用
載入鏡像和啟動(dòng)容器
-- 載入鏡像
[root@bogon ~]# docker pull training/webapp
-- 運(yùn)行容器(其中P參數(shù)將容器內(nèi)部使用的網(wǎng)絡(luò)端口映射到我們使用的主機(jī)上)
[root@bogon ~]# docker run -d -P training/webapp python app.py
查看容器狀態(tài):
[root@bogon ~]# docker ps

此時(shí)發(fā)現(xiàn)多了端口的信息,docker開(kāi)放了5000端口,映射到了主機(jī)的9001端口上,此時(shí)我們可以在瀏覽器訪問(wèn)應(yīng)用:

可以通過(guò) -p 參數(shù)來(lái)配置端口
[root@bogon ~]# docker run -d -p 5000:5000 training/webapp python app.py
查看web應(yīng)用程序的日志
-- 其中-f讓docker logs像tail -f一樣輸出
[root@bogon ~]# docker logs -f <容器ID或名字>
查看web應(yīng)用程序容器的進(jìn)程
[root@bogon ~]# docker top <容器ID或名字>
使用docker inspect來(lái)檢查docker底層信息,它會(huì)返回一個(gè)json文件記錄著容器的配置和狀態(tài)信息
[root@bogon ~]# docker inspect <容器ID或名字>
停止、重啟、移除web應(yīng)用容器
-- 停止
[root@bogon ~]# docker stop <容器ID或名字>
-- 重啟
[root@bogon ~]# docker restart <容器ID或名字>
-- 移除(移除前必須停止)
[root@bogon ~]# docker rm <容器ID或名字>
2、鏡像的使用
列出所有本地主機(jī)上的鏡像
[root@bogon ~]# docker images

列表各個(gè)列說(shuō)明:
REPOSITORY:表示鏡像的倉(cāng)庫(kù)源
TAG:鏡像的標(biāo)簽
IMAGE ID:鏡像ID
CREATED:鏡像創(chuàng)建時(shí)間
SIZE:鏡像大小
說(shuō)明:同一倉(cāng)庫(kù)可以有多個(gè)TAG,代表這個(gè)倉(cāng)庫(kù)源的不同個(gè)版本,如 ubuntu 倉(cāng)庫(kù)源里,有 15.10、14.04 等多個(gè)不同的版本,我們使用 REPOSITORY:TAG 來(lái)定義不同的鏡像。所以,我們?nèi)绻褂冒姹緸?5.10的ubuntu系統(tǒng)鏡像來(lái)運(yùn)行容器時(shí),命令如下:
[root@bogon ~]# docker run -t -i ubuntu:15.10 /bin/bash
如果不指定一個(gè)鏡像的版本標(biāo)簽,例如只使用 ubuntu,docker 將默認(rèn)使用 ubuntu:latest 鏡像。
獲取新鏡像
[root@bogon ~]# docker pull REPOSITORY:TAG
如:docker pull ubuntu:13.10

查找鏡像
第一種方法是在docker hub網(wǎng)站上找:https://hub.docker.com/
第二種方法是使用docker search命令來(lái)搜索
-- 如我們需要一個(gè)httpd的鏡像來(lái)作為web服務(wù)
[root@bogon ~]# docker search httpd

列表各列說(shuō)明:
NAME: 鏡像倉(cāng)庫(kù)源的名稱
DESCRIPTION: 鏡像的描述
OFFICIAL: 是否 docker 官方發(fā)布
stars: 類似 Github 里面的 star,表示點(diǎn)贊、喜歡的意思。
AUTOMATED: 自動(dòng)構(gòu)建。
拖取鏡像
-- 拖取httpd鏡像
[root@bogon ~]# docker pull httpd

拖取下來(lái)之后就可以使用這個(gè)鏡像了
[root@bogon ~]# docker run httpd

刪除鏡像
-- 刪除httpd鏡像
[root@bogon ~]# docker rmi httpd
構(gòu)建鏡像
構(gòu)建鏡像需要我們從零開(kāi)始創(chuàng)建一個(gè)鏡像,構(gòu)建鏡像分為手動(dòng)構(gòu)建和自動(dòng)構(gòu)建,這里我們采用Dockerfile自動(dòng)構(gòu)建的方式來(lái)構(gòu)建鏡像,因此,我們需要?jiǎng)?chuàng)建一個(gè)DockerFile文件,其中包含一組指令來(lái)告訴docker如何構(gòu)建我們的鏡像
-- 創(chuàng)建docker使用的目錄來(lái)規(guī)劃存放dockerfile文件的目錄(此步可忽略)
[root@bogon ~]# mkdir /home/docker
[root@bogon ~]# cd /home/docker
-- 創(chuàng)建文件需要注意的是:D需要大寫(xiě),當(dāng)我們構(gòu)建鏡像的時(shí)候docker默認(rèn)選取當(dāng)前目錄下的Dockerfile文件
[root@bogon ~]# vim DockerFile
然后在Dockerfile文件加入以下內(nèi)容:
FROM centos:6.7
MAINTAINER Catke "catke@qq.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd catke
RUN /bin/echo 'catke:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
注意:每個(gè)指令都會(huì)在鏡像上創(chuàng)建一個(gè)新的層,每個(gè)指令前綴都是大寫(xiě),其中第一條FROM指定使用哪個(gè)鏡像源,RUN指令告訴docker在鏡像內(nèi)執(zhí)行命令,如安裝了什么,需要添加什么用戶
Dockerfile文件參數(shù)說(shuō)明:
FROM (指定基礎(chǔ)鏡像)
MAINTAINER (指定維護(hù)者信息)
RUN (在命令前面加上RUN)
ADD (COPY文件,會(huì)自動(dòng)解壓,無(wú)法復(fù)制tar壓縮文件,從上下文目錄中復(fù)制文件或者目錄到容器里指定路徑,同等需求下,官方推薦使用COPY來(lái)實(shí)現(xiàn))
WORKDIR (設(shè)置當(dāng)前工作目錄,類似于cd)
VOLUME (設(shè)置卷,掛載主機(jī)目錄)
EXPOSE (指定對(duì)外的端口)
CMD (指定容器啟動(dòng)后要干的事情)
然后我們使用Dockerfile文件,通過(guò)docker build命令來(lái)構(gòu)建一個(gè)鏡像
-- 說(shuō)明:-t參數(shù)后面跟著的是REPOSITORY:TAG的格式,最后的“.”不要漏了,當(dāng)然你可以修改構(gòu)建的位置,“.”代表的是當(dāng)前目錄,
[root@bogon docker]# docker build -t centos:6.7 .
構(gòu)建完之后結(jié)果如下:


可以使用docker images命令來(lái)查看當(dāng)前的鏡像

然后我們使用這個(gè)鏡像來(lái)啟動(dòng)一個(gè)容器,并且驗(yàn)證我們剛剛文件里面寫(xiě)的創(chuàng)建catke用戶,結(jié)果如下:

創(chuàng)建鏡像
當(dāng)docker鏡像庫(kù)中的鏡像不能滿足我們的需求時(shí),我們可以通過(guò)兩種方式對(duì)鏡像進(jìn)行修改:
1、從已經(jīng)創(chuàng)建的容器中更新鏡像,并提交這個(gè)鏡像
2、使用dockerfile指令來(lái)創(chuàng)建一個(gè)新的鏡像
設(shè)置鏡像標(biāo)簽
以剛剛構(gòu)建的鏡像為例
-- 將IMAGE ID為0fc552672063的鏡像的tag設(shè)置為test(說(shuō)明,一個(gè)鏡像可以對(duì)應(yīng)多個(gè)tag)
[root@bogon ~]# docker tag 0fc552672063 centos:test

3、容器連接
端口映射
端口映射可以使用-p或者-P參數(shù)來(lái)實(shí)現(xiàn),其中,-P是容器內(nèi)部端口隨機(jī)映射到主機(jī)端口,-p是容器內(nèi)部端口綁定到主機(jī)端口
-- 創(chuàng)建一個(gè)python應(yīng)用容器,并將容器內(nèi)部端口隨機(jī)映射到主機(jī)端口
[root@bogon docker]# docker run -d -P training/webapp python app.py
-- 查看容器情況
[root@bogon docker]# docker ps

可以看到當(dāng)前容器端口9000綁定了5000端口
-- 創(chuàng)建一個(gè)python應(yīng)用容器,并將容器內(nèi)部端口綁定映射到主機(jī)端口
[root@bogon docker]# docker run -d -p 5000:5000 training/webapp python app.py
-- 查看容器情況
[root@bogon docker]# docker ps

同樣的,可以綁定ip
-- 創(chuàng)建一個(gè)python應(yīng)用容器,并將容器內(nèi)部端口指定映射到主機(jī)端口,并綁定127.0.0.1IP
[root@bogon docker]# docker run -d -p 127.00.1:5001:5000 training/webapp python app.py
如果要綁定udp端口,可以在端口后面加上/udp
[root@bogon docker]# docker run -d -p 127.00.1:5001:5000/udp training/webapp python app.py
docker容器互聯(lián)
-- 創(chuàng)建新的docker網(wǎng)絡(luò),其中-d參數(shù)指定docker網(wǎng)絡(luò)類型,可以是bridge、overlay
[root@bogon docker]# docker network create -d bridge test-net
-- 查看當(dāng)前docker網(wǎng)絡(luò)
[root@bogon docker]# docker network ls

-- 運(yùn)行一個(gè)容器,并使這個(gè)容器連接剛剛新建的網(wǎng)絡(luò)
[root@bogon docker]# docker run -it --name test1 --network test-net ubuntu /bin/bash
打開(kāi)一個(gè)新的客戶端,再運(yùn)行一個(gè)容器,同樣連接這個(gè)網(wǎng)絡(luò)
-- 再運(yùn)行一個(gè)容器,并使這個(gè)容器連接剛剛新建的網(wǎng)絡(luò)
[root@bogon docker]# docker run -it --name test2 --network test-net ubuntu /bin/bash
-- 分別在兩個(gè)容器安裝ping命令
root@6fa849899adb:/# apt-get update
root@6fa849899adb:/# apt install iputils-ping
root@540213266b2a:/# apt-get update
root@540213266b2a:/# apt install iputils-ping
在test1的容器上使用ping命令ping test2的容器

在test2的容器上使用ping命令ping test1的容器

配置DNS
[root@bogon docker]# docker run -it --rm host_ubuntu --dns=114.114.114.114 --dns-search=test.com ubuntu
參數(shù)說(shuō)明:
-h HOSTNAME 或者 --hostname=HOSTNAME: 設(shè)定容器的主機(jī)名,它會(huì)被寫(xiě)到容器內(nèi)的 /etc/hostname 和 /etc/hosts。
--dns=IP_ADDRESS: 添加 DNS 服務(wù)器到容器的 /etc/resolv.conf 中,讓容器用這個(gè)服務(wù)器來(lái)解析所有不在 /etc/hosts 中的主機(jī)名。
--dns-search=DOMAIN: 設(shè)定容器的搜索域,當(dāng)設(shè)定搜索域?yàn)?.example.com 時(shí),在搜索一個(gè)名為 host 的主機(jī)時(shí),DNS 不僅搜索 host,還會(huì)搜索 host.example.com。
注意:如果在啟動(dòng)容器的時(shí)候沒(méi)有指定dns信息,那么容器會(huì)默認(rèn)使用主機(jī)上的/etc/resolv.conf的配置來(lái)配置DNS
4、倉(cāng)庫(kù)管理
docker倉(cāng)庫(kù)存放docker鏡像的倉(cāng)庫(kù),目前官方有一個(gè)公共的倉(cāng)庫(kù):Docker Hub,大部分需求鏡像都可以從這個(gè)鏡像庫(kù)上下載下來(lái),地址是:https://hub.docker.com
基本操作:
-- 登錄
docker login
-- 退出
docker logout
-- 查找鏡像如sshd
docker search sshd
-- 拉取鏡像到本地
docker pull sshd
-- 推送鏡像到Docker Hub
docker push username/respositiry:tag
四、Docker安裝CentOS
1、查看可用CentOS版本
訪問(wèn)CentOS鏡像庫(kù)地址:https://hub.docker.com/_/centos?tab=tags&page=1
查看可用標(biāo)簽,標(biāo)簽右邊可以直接復(fù)制命令

2、拉取指定版本
-- 拉取鏡像
[root@bogon docker]# docker pull centos:centos7
-- 查看是否拉取成功
[root@bogon docker]# docker images

之后啟動(dòng)容器即可
五、Docker安裝MySQL
1、查看可用MySQL版本
訪問(wèn)MySQL鏡像庫(kù)地址:https://hub.docker.com/_/mysql?tab=tags 查看可用標(biāo)簽
2、拉取指定版本
-- 拉取鏡像
[root@bogon docker]# docker pull mysql:latest
-- 查看是否拉取成功
[root@bogon docker]# docker images

-- 運(yùn)行容器,
[root@bogon docker]# docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
參數(shù)說(shuō)明:
-p 3306:3306:映射容器服務(wù)的3306端口到主機(jī)的3306端口,外部主機(jī)可以通過(guò)主機(jī)IP:3306端口訪問(wèn)數(shù)據(jù)庫(kù)
MYSQL_ROOT_PASSWORD=123456:設(shè)置MySQL中root用戶的密碼
-- 進(jìn)入容器
docker exec -it efa46d7ea95c /bin/bash
進(jìn)入容器后可以mysql -uroot -p來(lái)登錄MySQL
六、Docker安裝Tomcat
tomcat的安裝方式跟上面的方式一致
1、搜索鏡像
2、拉取鏡像
3、啟動(dòng)容器
其它的相關(guān)服務(wù)安裝方式也大致相同,這里就不多做研究
七、Docker GUI管理
這里使用Portainer來(lái)作為容器的GUI管理方案。
官方地址:https://portainer.io/install.html
安裝命令:
# docker volume create portainer_data
# docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
另一種安裝命令:
# docker search portainer
# docker pull portainer/portainer
# docker run -d -p 9000:9000 -v /run/docker.sock:/run/docker.sock -v portainer_data:/data portainer/portainer
使用:
訪問(wèn)IP:9000 即可進(jìn)入容器管理頁(yè)面
八、參考并致謝
https://www.runoob.com/docker/centos-docker-install.html
https://www.cnblogs.com/lylsr/p/11173012.html