RedHat/CentOS8【Docker】鏡像制作編排和容器部署

Docker (Community Edition: 社區(qū)版) 是一個(gè)開源(遵循 Apache 2.0 協(xié)議)的應(yīng)用容器引擎东囚。Docker 可以打包應(yīng)用以及依賴包到一個(gè)輕量級(jí)劣坊、可移植的 鏡像 中,然后通過鏡像創(chuàng)建 容器 并發(fā)布到任何流行 Linux 系統(tǒng)的主機(jī)上采盒,實(shí)現(xiàn)虛擬化。鏡像 存儲(chǔ)在遠(yuǎn)程倉庫或者本地倉庫中便于管理和使用蔚润;容器 是完全使用沙箱機(jī)制磅氨,性能開銷極低,相互之間不會(huì)有任何接口嫡纠。

本方案基于 CentOS8 系統(tǒng)設(shè)計(jì)悍赢,建議在 RedHat/CentOS 系統(tǒng)中使用。

目錄

1.技術(shù)評(píng)估

2.Docker 的安裝和配置

3.Docker 使用阿里云鏡像倉庫
-- 3.1.注冊(cè)阿里云賬號(hào)并開通容器服務(wù)
-- 3.2.使用阿里云倉庫加速器
-- 3.3.使用阿里云私有倉庫

4.Harbor 私有化鏡像倉庫
-- 4.1.Harbor 的安裝和配置
-- 4.2.Docker 使用 Harbor 私有倉庫

5.Docker 鏡像制作

6.Docker 鏡像打包货徙、導(dǎo)入和運(yùn)行

7.Docker Compose 容器編排
-- 7.1.Docker Compose 的安裝和配置
-- 7.2.Docker Compose 容器編排

附錄一 相關(guān)技術(shù)指南目錄

附錄二 安裝 Xfce 桌面環(huán)境和 VNC 遠(yuǎn)程桌面

附錄三 擴(kuò)展 CentOS 基礎(chǔ)鏡像


1.技術(shù)評(píng)估

1左权、Docker 和 VM(虛擬機(jī))的區(qū)別

VM 是一個(gè)運(yùn)行在宿主機(jī)之上的完整的操作系統(tǒng),VM 虛擬機(jī)本身會(huì)占用較多的 CPU痴颊、內(nèi)存赏迟、硬盤等資源,在 VM 虛擬機(jī)上部署的應(yīng)用程序還需繼續(xù)占用更多資源蠢棱。

Docker 只包含應(yīng)用程序以及依賴庫锌杀,基于容器運(yùn)行在宿主機(jī)上甩栈,并處于一個(gè)隔離的環(huán)境中,這使得Docker 更加輕量高效糕再,啟動(dòng)容器只需幾秒鐘之內(nèi)完成量没,因此可以輕易的應(yīng)用到構(gòu)建標(biāo)準(zhǔn)化的應(yīng)用中。但 Docker 隔離效果不如 VM突想,主要體現(xiàn)在:共享宿主機(jī)操作系統(tǒng)的一些基礎(chǔ)庫殴蹄、網(wǎng)絡(luò)配置功能相對(duì)簡(jiǎn)單(主要以橋接方式為主)、查看日志不夠方便等問題猾担。

Docker 和 VM 的虛擬化架構(gòu)如下圖:

Docker 和 VM 虛擬化架構(gòu)圖

2袭灯、Docker 的特點(diǎn)

1)主機(jī)資源利用率高,Docker 容器直接在宿主機(jī)的操作系統(tǒng)內(nèi)核上運(yùn)行绑嘹,不需要硬件虛擬化稽荧;

2)啟動(dòng)時(shí)間快,Docker 容器秒級(jí)啟動(dòng)工腋,優(yōu)于 VM 虛擬機(jī)姨丈;

3)運(yùn)行環(huán)境一致性,Docker 將應(yīng)用同依賴環(huán)境打包成鏡像擅腰,通過鏡像創(chuàng)建和發(fā)布容器到系統(tǒng)上构挤,各系統(tǒng)部署的應(yīng)用具有很強(qiáng)的一致性;

4)部署簡(jiǎn)單惕鼓,Docker 的安裝和容器部署過程簡(jiǎn)單筋现,標(biāo)準(zhǔn)化程度高,學(xué)習(xí)成本低箱歧。

3矾飞、Docker 的核心組件

Docker 組件關(guān)系圖

1)Docker 主機(jī)【Host】: 一個(gè)物理機(jī)或虛擬機(jī),用于運(yùn)行 Docker 服務(wù)進(jìn)程和容器呀邢。

2)Docker 服務(wù)端【Server】: Docker 守護(hù)進(jìn)程洒沦, 運(yùn)行 Docker 容器。

3)Docker 客戶端【Client】: 客戶端使用命令或其他工具調(diào)用 Docker API价淌。

4)Docker 鏡像【Images】: 鏡像是 Docker 為創(chuàng)建容器使用的模板申眼。

5)Docker 倉庫【Registry】: 保存鏡像的倉庫,有遠(yuǎn)程倉庫和本地倉庫蝉衣。一個(gè) Registry 中可以包含多個(gè)倉庫 【Repository】括尸,每個(gè)倉庫可以包含多個(gè)標(biāo)簽【Tag】,每個(gè)標(biāo)簽對(duì)應(yīng)一個(gè)鏡像病毡。通常濒翻,一個(gè)倉庫會(huì)包含同一個(gè)軟件不同版本的鏡像,而標(biāo)簽就常用于區(qū)分軟件的版本,可以通過 "<倉庫名>:<標(biāo)簽>" 的格式來指定特定版本的軟件所對(duì)應(yīng)的鏡像有送,如果不給出標(biāo)簽淌喻,將以 "latest" 作為默認(rèn)標(biāo)簽。國外官方的遠(yuǎn)程倉庫地址是【https://hub.docker.com/】雀摘,國內(nèi)阿里云提供的遠(yuǎn)程倉庫地址是【https://cr.console.aliyun.com/cn-hangzhou/images

6)Docker 容器【Container】: 容器是從鏡像生成對(duì)外提供服務(wù)的一個(gè)或一組獨(dú)立運(yùn)行的虛擬化服務(wù)裸删。

7)Docker 宿主機(jī)【Machine】:宿主機(jī)是一個(gè)簡(jiǎn)化 Docker 安裝的命令行工具,通過一個(gè)簡(jiǎn)單的命令行即可在相應(yīng)的平臺(tái)上安裝 Docker 阵赠。

4涯塔、Docker 的應(yīng)用場(chǎng)景

1)提供一次性的環(huán)境。例如在本地測(cè)試他人的軟件豌注、持續(xù)集成的時(shí)候提供單元測(cè)試和構(gòu)建的環(huán)境伤塌。

2)提供彈性的云服務(wù)灯萍。因?yàn)?Docker 容器可以隨開隨關(guān)轧铁,很適合動(dòng)態(tài)擴(kuò)容和縮容。

3)組建微服務(wù)架構(gòu)旦棉。通過多個(gè)容器齿风,在一臺(tái)主機(jī)上可以運(yùn)行多個(gè)服務(wù),因此能夠在本機(jī)就可以模擬出微服務(wù)架構(gòu)绑洛。


2.Docker 的安裝和配置

1救斑、從阿里云下載并安裝 Docker 的 Yum 源。

1)打開 Docker 的阿里云 Yum 源網(wǎng)站【https://mirrors.aliyun.com/docker-ce/linux/centos/】真屯,下載 Docker 阿里云 Yum 源文件到用戶主目錄中脸候。

Docker 阿里云 Yum 源

2)將下載的 Yum 源文件拷貝至 "/etc/yum.repos.d" 目錄下。

[centos@host ~ ]$ sudo mv ~/docker-ce.repo /etc/yum.repos.d

3)更新 Yum 源绑蔫。

[centos@host ~]$ sudo dnf clean all
[centos@host ~]$ sudo dnf makecache
Docker CE Stable - x86_64                        53 kB/s |  25 kB     00:00

2运沦、人工從阿里云下載并安裝 Docker 的依賴軟件 "containerd.io" 最高版本(Docker 的 Yum 源目前更新到 CentOS7 版本,還沒有對(duì) CentOS8 進(jìn)行專門適配配深,因此需要人工處理此步驟携添,伴隨 Docker 的 Yum 不斷更新,以后可能不需要此步驟)篓叶。

1)打開 Docker 的 Yum 源文件烈掠,找到 Yum 源的互聯(lián)網(wǎng)位置。

使用文本編輯器打開 "/etc/yum.repos.d/docker-ce.repo" 文件:

[centos@host ~]$ sudo gedit /etc/yum.repos.d/docker-ce.repo

從配置文件中找到 Yum 源的位置信息如下:

[docker-ce-stable]
name=Docker CE Stable - $basearch
# baseurl 屬性定義了 Yum 源的互聯(lián)網(wǎng)位置缸托,【$basearch】變量表示操作系統(tǒng)的架構(gòu)左敌,本例中是"x86_64"。
# 因此完整的 Yum 源是【https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable】
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

2)在瀏覽器中打開 Yum 源網(wǎng)址俐镐,點(diǎn)擊 "Packages" 子目錄中:


進(jìn)入 Packages 子目錄

3)找到最新版本的 "containerd.io" 安裝包母谎,復(fù)制其下載地址:

最新版本的 "containerd.io" 安裝包

在瀏覽器中復(fù)制其下載地址是:【https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm

4)通過 Yum 源指令人工下載安裝最新版的 "containerd.io" 安裝包:

[centos@host ~]$ sudo dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm

注意:如果使用本地或私有yum源,可忽略第1-2步京革,直接獲取本地/私有yum源的配置文件使用即可奇唤。有關(guān)如何進(jìn)行yum源的本地化/私有化幸斥,請(qǐng)閱讀文章《RedHat/CentOS8 【國內(nèi)/本地/私有 YUM 源】制作和使用》,文章地址【http://www.reibang.com/p/68db74388600】咬扇。

3甲葬、通過 Yum 源安裝 Docker 社區(qū)版。

[centos@host ~]$ sudo dnf install docker-ce

4懈贺、為 Docker 的使用和管理用戶追加到 "docker" 擴(kuò)展組经窖,并重啟后生效。

[centos@host ~]$ sudo usermod -aG docker centos
[centos@host ~]$ reboot

5梭灿、配置 Docker 的工作目錄画侣、配置目錄。

使用文本編輯器創(chuàng)建配置文件:

[centos@host ~]$ sudo mkdir -p /data/docker
[centos@host ~]$ sudo chown -R root:docker /data/docker
[centos@host ~]$ sudo mkdir -p /etc/docker

6堡妒、在 "/etc/docker" 目錄下創(chuàng)建或編輯 "daemon.json" 文件配乱,并寫入 Docker 工作目錄配置信息。

使用文本編輯器創(chuàng)建配置文件:

[centos@host ~]$ sudo gedit /etc/docker/daemon.json

在文件中寫入以下配置并保存(刪除注釋):

{
  # 加速器
  # "registry-mirrors": ["https://ijlmqclb.mirror.aliyuncs.com"],
  # 工作目錄
  "data-root": "/data/docker"
}

7皮迟、開啟網(wǎng)絡(luò)轉(zhuǎn)發(fā)搬泥,使 Docker 容器能夠通過網(wǎng)絡(luò)橋接 "bridge" 方式(默認(rèn)網(wǎng)絡(luò)網(wǎng)配)連通網(wǎng)絡(luò)。

使用文本編輯器打開配置文件:

[centos@host ~]$ sudo gedit /etc/sysctl.conf

在文件中追加以下內(nèi)容并保存:

net.ipv4.ip_forward = 1

重載配置文件:

[centos@host ~]$ sudo sysctl -p

8伏尼、修改 SELinux 配置文件忿檩,永久關(guān)閉 SELinux。

使用文本編輯器打開"/etc/selinux/config"文件:

[centos@host ~]$ sudo gedit /etc/selinux/config

將 "SELINUX" 參數(shù)設(shè)置為:"permissive" 或者 "disabled"爆阶,并保存:

#     enforcing - 表示啟用 SELinux 安全策略燥透。
#     permissive - 表示啟用 SELinux 安全策略,但不強(qiáng)制驗(yàn)證辨图。如果執(zhí)行第一步可以正常運(yùn)行班套,則建議設(shè)置此值。
#     disabled - 關(guān)閉 SELinux 安全策略徒役,相當(dāng)于沒有安裝 SELinux孽尽。
SELINUX=disabled

重啟服務(wù)器:

[centos@host ~]$ sudo reboot

9、關(guān)閉防火墻并禁用開機(jī)啟動(dòng)忧勿,CentOS8 使用 firewall 作為防火墻管理程序杉女,firewalld 的底層調(diào)用的是 iptables,firewalld 啟動(dòng)或重啟時(shí)鸳吸,會(huì)將 iptables 的規(guī)則清空熏挎,導(dǎo)致 docker 啟動(dòng)容器出錯(cuò)。

[centos@host ~]$ sudo systemctl stop firewalld.service
[centos@host ~]$ sudo systemctl disable firewalld.service

10晌砾、配置 Docker 服務(wù)開機(jī)自啟動(dòng)(Docker 安裝后已默認(rèn)配置)坎拐。

使用文本編輯器打開配置文件:

[centos@host ~]$ sudo gedit /usr/lib/systemd/system/docker.service

驗(yàn)證或修改文件內(nèi)容并保存:

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
BindsTo=containerd.service
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3

# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s

# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity

# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes

# kill only the docker process, not all processes in the cgroup
KillMode=process

[Install]
WantedBy=multi-user.target

11、啟動(dòng) Docker 服務(wù),并設(shè)置為開機(jī)自動(dòng)啟動(dòng)哼勇。

[centos@host ~]$ sudo systemctl daemon-reload
[centos@host ~]$ sudo systemctl start docker
[centos@host ~]$ sudo systemctl enable docker

12都伪、運(yùn)行 Docker 命令,查看版本信息測(cè)試积担。

[centos@host ~]$ docker version

13陨晶、登錄到 Docker 官方倉庫【https://hub.docker.com】,創(chuàng)建 Docker 官方遠(yuǎn)程倉庫賬號(hào)帝璧,并使用該賬號(hào)完成 Docker 的用戶認(rèn)證先誉。Docker 安裝后默認(rèn)連接了官方遠(yuǎn)程倉庫,需要在該網(wǎng)站上申請(qǐng)賬號(hào)的烁,并使用該賬號(hào)登錄 Docker 客戶端褐耳。

1)創(chuàng)建賬號(hào):


第一步,創(chuàng)建賬號(hào)
第二步渴庆,選擇免費(fèi)使用協(xié)議
第三步铃芦,提示郵箱驗(yàn)證賬號(hào)
第四步,登錄電子郵箱驗(yàn)證賬號(hào)
第五步把曼,賬號(hào)注冊(cè)成功

2)Docker 客戶端登錄倉庫:

[centos@host ~]$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: zhangyisoho
Password: 
WARNING! Your password will be stored unencrypted in /home/centos/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

14蝌借、拉取 Docker 示例容器 "hello-world"懦砂,拉取成功后在本地倉庫中查詢悼沿。

拉取示例容器 "hello-world":

[centos@host ~]$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:49a1c8800c94df04e9658809b006fd8a686cab8028d33cfba2cc049724254202
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

在本地倉庫中查詢拉取容器:

[centos@host ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        7 months ago        13.3kB

15凫岖、運(yùn)行 Docker 示例容器 "hello-world"悦穿。

[centos@host ~]$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit: 
 https://docs.docker.com/get-started/

注意:在國內(nèi)訪問官方 Docker 遠(yuǎn)程倉庫速度受限浮声,會(huì)經(jīng)常提示網(wǎng)絡(luò)超時(shí)問題怨咪,需要反復(fù)嘗試拭荤,幾乎無法使用僚饭,不具備生產(chǎn)環(huán)境的使用條件震叮,需要替換為國內(nèi)倉庫或者私有倉庫使用。

Docker 常用命令使用指南請(qǐng)閱讀文章【https://www.runoob.com/docker/docker-command-manual.html


3.Docker 使用阿里云鏡像倉庫

在國內(nèi)訪問官方 Docker 遠(yuǎn)程倉庫速度受限鳍鸵,會(huì)經(jīng)常提示網(wǎng)絡(luò)超時(shí)問題苇瓣,需要反復(fù)嘗試,幾乎無法使用偿乖,不具備生產(chǎn)環(huán)境的使用條件击罪,需要替換為國內(nèi)倉庫或者私有倉庫使用。

國內(nèi)阿里云提供 Docker 容器服務(wù)贪薪,主要包括 官方鏡像加速器私有倉庫 媳禁。官方鏡像加速器 在配置后能夠極快的訪問國外官方 Docker 遠(yuǎn)程倉庫;私有倉庫 為用戶提供個(gè)人鏡像倉庫服務(wù)画切,用戶可以將自定義的鏡像上傳到倉庫中竣稽,以便于其他用戶拉取使用。

3.1.注冊(cè)阿里云賬號(hào)并開通容器服務(wù)

1、訪問阿里云站點(diǎn)【https://www.aliyun.com】毫别,注冊(cè)阿里云用戶賬號(hào)娃弓。(已注冊(cè)用戶忽略本步驟)

第一步,訪問站點(diǎn)并注冊(cè)賬號(hào)
第二步岛宦,選擇賬號(hào)密碼注冊(cè)
第三步忘闻,填寫信息并注冊(cè)
第四步,注冊(cè)完成后進(jìn)入控制臺(tái)

2恋博、使用阿里云賬號(hào)登錄控制臺(tái)齐佳。

第一步,訪問站點(diǎn)并注冊(cè)賬號(hào)
第二步债沮,選擇賬號(hào)密碼登錄
第三步炼吴,填寫信息并登錄
第四步,從導(dǎo)航菜單中選擇"容器鏡像服務(wù)"
第五步疫衩,前往開通容器服務(wù)
第六步硅蹦,設(shè)置容器倉庫登錄密碼
第七步,設(shè)置口令后確定開通容器服務(wù)

3.2.使用阿里云倉庫加速器

1闷煤、注冊(cè)阿里云用戶并登陸控制臺(tái)童芹,開通容器鏡像服務(wù),操作過程請(qǐng)閱讀章節(jié) “3.1.注冊(cè)阿里云賬號(hào)并開通容器服務(wù)”鲤拿。

2假褪、從導(dǎo)航菜單中打開 "鏡像加速器" 頁面,使用阿里云提供的加速器地址近顷,按照對(duì)應(yīng)操作系統(tǒng)版本的操作指南配置 Docker 宿主機(jī)生音。如下圖所示:

阿里云鏡像加速器操作指南

3、配置 Docker 阿里云倉庫加速器窒升。在 "/etc/docker" 目錄下創(chuàng)建或編輯 "daemon.json" 文件缀遍,并寫入加速器配置信息。

使用文本編輯器創(chuàng)建配置文件:

[centos@host ~]$ sudo gedit /etc/docker/daemon.json

根據(jù)阿里云提供的加速器地址在文件中寫入以下配置并保存(刪除注釋):

{
  # 加速器
  "registry-mirrors": ["https://ijlmqclb.mirror.aliyuncs.com"],
  # 工作目錄
  "data-root": "/data/docker"
}

4饱须、重新加載 Docker 服務(wù)并重啟服務(wù)域醇。

[centos@host ~]$ sudo systemctl daemon-reload
[centos@host ~]$ sudo systemctl restart docker

5、拉取 Docker 示例容器 "hello-world"(速度會(huì)大幅提高且不會(huì)斷線)蓉媳,拉取成功后在本地倉庫中查詢譬挚。

拉取示例容器 "hello-world":

[centos@host ~]$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:49a1c8800c94df04e9658809b006fd8a686cab8028d33cfba2cc049724254202
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

在本地倉庫中查詢拉取容器:

[centos@host ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        7 months ago        13.3kB

注意:加速器僅是使 Docker 在訪問官方遠(yuǎn)程倉庫時(shí)提高訪問速度(解決了國外網(wǎng)絡(luò)訪問受限的問題),它并沒有使用國內(nèi)倉庫進(jìn)行替代督怜,因此仍需使用官方倉庫的用戶登錄 Docker 客戶端殴瘦,操作過程請(qǐng)閱讀章節(jié) “2.Docker 的安裝和配置” 的第 8 個(gè)步驟。


3.3.使用阿里云私有倉庫

1号杠、注冊(cè)阿里云用戶并登陸控制臺(tái)蚪腋,開通容器鏡像服務(wù)丰歌,操作過程請(qǐng)閱讀章節(jié) “3.1.注冊(cè)阿里云賬號(hào)并開通容器服務(wù)”。

2屉凯、從導(dǎo)航菜單中打開 "鏡像倉庫" 頁面立帖,創(chuàng)建和管理阿里云私有倉庫。如下圖所示:

創(chuàng)建和管理阿里云私有倉庫

3悠砚、創(chuàng)建私有倉庫晓勇。

第一步,輸入倉庫信息
第二步灌旧,選擇代碼源绑咱,并創(chuàng)建鏡像倉庫
第三步,查看已創(chuàng)建的倉庫枢泰,并通過"管理"按鈕查看操作指南
第四步描融,查看私有倉庫操作指南

4、Docker 客戶端登錄阿里云私有倉庫衡蚂。

[centos@host ~]$ docker login registry.cn-hangzhou.aliyuncs.com
Username: zhangyi_soho
Password: 
WARNING! Your password will be stored unencrypted in /home/centos/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

5窿克、Docker 客戶端推送本地鏡像到私有倉庫中,以鏡像 "hello-world" 為例毛甲。

查詢鏡像的 "ImageId":

[centos@host ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        7 months ago        13.3kB

推送本地鏡像:

[centos@host ~]$ docker tag bf756fb1ae65 registry.cn-hangzhou.aliyuncs.com/zhangyi_soho/hello-world:latest
[centos@host ~]$ docker push registry.cn-hangzhou.aliyuncs.com/zhangyi_soho/hello-world:latest
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/zhangyi_soho/hello-world]
9c27e219663c: Pushed 
latest: digest: sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042 size: 525

在阿里云私有倉庫的管理頁面中查看:


查看私有倉庫中的鏡像

6年叮、Docker 客戶端從阿里云私有倉庫中拉取鏡像到本地,以鏡像 "hello-world" 為例玻募。

[centos@host ~]$ docker pull registry.cn-hangzhou.aliyuncs.com/zhangyi_soho/hello-world:latest
latest: Pulling from zhangyi_soho/hello-world
Digest: sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042
Status: Image is up to date for registry.cn-hangzhou.aliyuncs.com/zhangyi_soho/hello-world:latest
registry.cn-hangzhou.aliyuncs.com/zhangyi_soho/hello-world:latest

7只损、在本地倉庫中查詢拉取容器。

[centos@host ~]$ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
registry.cn-hangzhou.aliyuncs.com/zhangyi_soho/hello-world   latest              bf756fb1ae65        7 months ago        13.3kB

4.Harbor 私有化鏡像倉庫

假設(shè)主機(jī) IP 地址是【192.168.0.20】补箍。

Harbor 是 VMware 公司開源(遵循 Apache-2.0 License 協(xié)議)的企業(yè)級(jí) Docker Registry 項(xiàng)目改执,目標(biāo)是幫助用戶迅速搭建一個(gè)企業(yè)級(jí)的Docker registry 服務(wù)啸蜜。它以 Docker 公司的開源項(xiàng)目 Registry 為基礎(chǔ)坑雅,提供了管理界面、訪問控制衬横、AD/LDAP 集成裹粤、審計(jì)日志 等企業(yè)用戶需求的功能,并支持中文語言蜂林。Harbor 的每個(gè)組件都是以 Docker 容器的形式構(gòu)建的遥诉,因此需要使用 Docker Compose 進(jìn)行部署。

Docker Compose 是用于定義和運(yùn)行多容器 Docker 應(yīng)用程序的工具噪叙。通過 Docker Compose 可以使用 YAML 文件來配置應(yīng)用程序需要的所有服務(wù)矮锈。然后,使用一個(gè)命令睁蕾,就可以從 YAML 文件配置中創(chuàng)建并啟動(dòng)所有服務(wù)苞笨。

4.1.Harbor 的安裝和配置

1债朵、下載和安裝 Docker,操作過程請(qǐng)閱讀章節(jié) “2.Docker 的安裝和配置”瀑凝。

2序芦、下載和安裝 Docker Compose 。

1)打開 Docker Compose 下載頁面【https://github.com/docker/compose/releases】粤咪,下載 Docker Compose 的編譯程序到用戶主目錄中:

Docker Compose 下載頁面

下載后將 Docker Compose 編譯程序安裝到 "/usr/local/bin" 目錄中:

[centos@host ~]$ sudo mv ~/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose

或者通過 "curl" 指令下載并安裝:

[centos@host ~]$ sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2)授予程序可行性權(quán)限谚中,并建立軟鏈接到系統(tǒng)默認(rèn)的 shell 目錄中 "/usr/bin":

[centos@host ~]$ sudo chmod +x /usr/local/bin/docker-compose
[centos@host ~]$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

3)測(cè)試是否安裝成功:

[centos@host ~]$ docker-compose --version
docker-compose version 1.26.2, build eefe0d31

3、打開 Harbor 下載頁面【https://github.com/goharbor/harbor/releases】寥枝,下載 Harbor 離線版編譯程序 tgz 包到用戶主目錄中宪塔。

Harbor 下載頁面

4、解壓縮編譯程序 tar 包到"/usr/local"目錄中囊拜。

[centos@host ~]$ sudo tar -xvf harbor-offline-installer-v2.0.2.tgz -C /usr/local
[centos@host ~]$ ll /usr/local
drwxr-xr-x. 2 root root 122 8月   7 15:01 harbor

5蝌麸、設(shè)置 Harbor 的配置文件參數(shù)。

拷貝配置文件模板創(chuàng)建配置文件:

[centos@host ~]$ sudo cp /usr/local/harbor/harbor.yml.tmpl /usr/local/harbor/harbor.yml

使用文本編輯器打開配置文件:

[centos@host ~]$ sudo gedit /usr/local/harbor/harbor.yml

修改或驗(yàn)證文件中的以下參數(shù)并保存:

########### 常用設(shè)置 ###########

# 目標(biāo)計(jì)算機(jī)的IP地址或完全限定的域名艾疟,用于訪問管理界面和倉庫服務(wù)
# 例如:[ 192.168.0.20 或 reg.docker.harbor ]来吩。不要使用 localhost 或 127.0.0.1 作為主機(jī)名(外部客戶端將無法訪問)
hostname: reg.docker.harbor

# http 配置
http:
  # http 服務(wù)端口號(hào),默認(rèn)值是【80】
  port: 80

# https 配置
https:
  # https 服務(wù)端口號(hào)蔽莱,默認(rèn)值是【80】
  port: 443
  # Nginx 的 SSL證書的路徑弟疆,僅在協(xié)議設(shè)置為 https 時(shí)應(yīng)用
  certificate: /usr/local/harbor/https/reg.docker.harbor.crt
  # Nginx 的 SSL密鑰的路徑,僅在協(xié)議設(shè)置為 https 時(shí)應(yīng)用
  private_key: /usr/local/harbor/https/reg.docker.harbor.key

# 管理員賬號(hào)【admin】初始口令盗冷,僅在首次登錄時(shí)有效怠苔,首次登錄后系統(tǒng)會(huì)提示更改管理員口令
harbor_admin_password: Harbor12345

# 數(shù)據(jù)庫配置
database:
  # 數(shù)據(jù)庫【root】賬號(hào)口令
  password: root123
  # 數(shù)據(jù)庫連接池中的最大連接數(shù),當(dāng)≤0時(shí)將不保留空閑連接
  max_idle_conns: 50
  # 數(shù)據(jù)庫最大連接數(shù)仪糖,當(dāng)≤0時(shí)不限制連接數(shù)柑司,postgres 數(shù)據(jù)庫的默認(rèn)連接數(shù)是 1024 
  max_open_conns: 1024

# 數(shù)據(jù)存儲(chǔ)目錄目錄
data_volume: /data/harbor

########### 其他設(shè)置(通常情況下使用默認(rèn)值均可) ###########

# 內(nèi)部組件之間的 tls 通信
# internal_tls:
     # 啟動(dòng)內(nèi)部組件之間的 tls 通信
     # enabled: true
     # 證書和秘鑰文件存放目錄
     # dir: /etc/harbor/tls/internal

# 外部代理,當(dāng)啟用時(shí)锅劝,將不再使用主機(jī)名
# external_url: https://reg.mydomain.com:8433

# 存儲(chǔ)服務(wù)配置攒驰,默認(rèn)情況下,數(shù)據(jù)存儲(chǔ)設(shè)置在本地文件系統(tǒng)上故爵,如果要使用外部存儲(chǔ)玻粪,則取消對(duì)存儲(chǔ)服務(wù)設(shè)置的注釋
# storage_service:
  # 自定義根證書的路徑,它將被注入到注冊(cè)表和圖表存儲(chǔ)庫容器的信任庫中诬垂。當(dāng)用戶使用自簽名證書托管內(nèi)部存儲(chǔ)時(shí)劲室,通常需要這樣做。
  # ca_bundle:
  # 存儲(chǔ)后端结窘,默認(rèn)為文件系統(tǒng)很洋,選項(xiàng)包括 filesystem、azure隧枫、gcs喉磁、s3棺克、swift 和 oss
  # 有關(guān)此配置的詳細(xì)信息,請(qǐng)參閱https://docs.docker.com/registry/configuration/
  # filesystem:
  # maxthreads: 100
  # 設(shè)置為 true 時(shí)线定,禁用注冊(cè)表重定向娜谊。
  # redirect:
    # disabled: false

# Clair(一款鏡像安全工具) 配置
clair:
  # Clair 更新程序的間隔,單位為小時(shí)斤讥,設(shè)置為【0】以禁用更新程序
  updaters_interval: 12

# Trivy(一款鏡像漏洞掃描工具) 配置
trivy:
  # 設(shè)置為 true 表示只顯示已修復(fù)的漏洞
  ignore_unfixed: false
  # 啟用或禁用從 GitHub 上更新 Trivy 數(shù)據(jù)庫
  skip_update: false
  #
  # 設(shè)置為 true 表示不安全的標(biāo)志跳過驗(yàn)證注冊(cè)表證書
  insecure: false
  # 從 GitHub 上更新 Trivy DB 是的訪問令牌纱皆,令牌創(chuàng)建參照:
  # https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line
  # github_token: xxx

# 作業(yè)配置
jobservice:
  # Maximum number of job workers in job service
  # 作業(yè)服務(wù)中的最大復(fù)制工作者數(shù)。對(duì)于每個(gè)鏡像復(fù)制作業(yè)芭商,工作程序?qū)⒋鎯?chǔ)庫的所有標(biāo)記同步到遠(yuǎn)程目標(biāo)派草。增加此數(shù)量可以在系統(tǒng)中執(zhí)行更多并發(fā)復(fù)制作業(yè)。但是铛楣,由于每個(gè)工作者都消耗一定量的網(wǎng)絡(luò) / CPU / IO資源近迁,請(qǐng)根據(jù)主機(jī)的硬件資源仔細(xì)選擇該屬性的值。
  max_job_workers: 10

# 通知配置
notification:
  # Maximum retry count for webhook job
  # Web 連接作業(yè)的最大重試數(shù)
  webhook_job_max_retry: 10

# 圖表配置
chart:
  # 如果設(shè)置為啟用圖表將使用絕對(duì)網(wǎng)址簸州,否則將其設(shè)置為禁用鉴竭,圖表將使用相對(duì)網(wǎng)址
  absolute_url: disabled

# 日志配置
log:
  # 日志級(jí)別,選項(xiàng)是調(diào)試岸浑,信息搏存,警告,錯(cuò)誤矢洲,致命
  level: info
  # 配置本地存儲(chǔ)中的日志
  local:
    # 日志文件在被刪除之前被輪換的次數(shù)璧眠。如果 count 為 0,則刪除
    rotate_count: 50
    # 僅當(dāng)日志文件大于 log_rotate_size 字節(jié)時(shí)才會(huì)輪換日志文件读虏。如果大小后跟 k责静,則假定大小以千字節(jié)為單位。如果使用 M盖桥,則大小以兆字節(jié)為單位灾螃,如果使用 G,則大小以千兆字節(jié)為單位葱轩。設(shè)置值:100睦焕,100k,100M靴拱、100G 都是有效的
    rotate_size: 200M
    # 存儲(chǔ)中日志的目錄
    location: /var/log/harbor

  # 取消對(duì)以下行的注釋以啟用外部 syslog 終結(jié)點(diǎn)。
  # external_endpoint:
       # 用于將日志傳輸?shù)酵獠慷它c(diǎn)的協(xié)議猾普,選項(xiàng)是 tcp 或 udp
       # protocol: tcp
       # 外部終結(jié)點(diǎn)的主機(jī)
       # host: localhost
       # 外部終結(jié)點(diǎn)的端口號(hào)
       # port: 5140

# 此屬性用于檢測(cè)配置文件的版本袜炕,請(qǐng)勿修改!
_version: 2.0.0

# 使用外部數(shù)據(jù)庫時(shí)配置初家。
# external_database:
  # harbor:
    # host: harbor_db_host
    # port: harbor_db_port
    # db_name: harbor_db_name
    # username: harbor_db_username
    # password: harbor_db_password
    # ssl_mode: disable
    # max_idle_conns: 2
    # max_open_conns: 0
  # clair:
    # host: clair_db_host
    # port: clair_db_port
    # db_name: clair_db_name
    # username: clair_db_username
    # password: clair_db_password
    # ssl_mode: disable
  # notary_signer:
    # host: notary_signer_db_host
    # port: notary_signer_db_port
    # db_name: notary_signer_db_name
    # username: notary_signer_db_username
    # password: notary_signer_db_password
    # ssl_mode: disable
  # notary_server:
    # host: notary_server_db_host
    # port: notary_server_db_port
    # db_name: notary_server_db_name
    # username: notary_server_db_username
    # password: notary_server_db_password
    # ssl_mode: disable

# 使用外部 Redis 服務(wù)器時(shí)配置
# external_redis:
  # host: redis
  # port: 6379
  # password:
  # registry_db_index: 1
  # jobservice_db_index: 2
  # chartmuseum_db_index: 3
  # clair_db_index: 4
  # trivy_db_index: 5
  # idle_timeout_seconds: 30

# 使用自簽名的 uaa 證書
# uaa:
  # ca_file: /path/to/ca

# 全局代理
# Config http proxy for components, e.g. http://my.proxy.com:3128
# Components doesn't need to connect to each others via http proxy.
# Remove component from `components` array if want disable proxy
# for it. If you want use proxy for replication, MUST enable proxy
# for core and jobservice, and set `http_proxy` and `https_proxy`.
# Add domain to the `no_proxy` field, when you want disable proxy
# for some special registry.
proxy:
  http_proxy:
  https_proxy:
  no_proxy:
  components:
    - core
    - jobservice
    - clair
    - trivy

6偎窘、創(chuàng)建本地 DNS 配置(當(dāng)配置文件中【hostname】參數(shù)設(shè)置為域名時(shí)需執(zhí)行本步操作)乌助。

使用文本編輯器打開本地 DNS 映射文件 "/etc/hosts":

[centos@host ~]$ sudo gedit /etc/hosts

在文件中追加配置并保存:

192.168.0.20 reg.docker.harbor

7、安裝 Openssl(CentOS8 默認(rèn)已安裝)并創(chuàng)建 Https 的 SSL 自簽證書(當(dāng)配置文件中啟用 https 時(shí)需執(zhí)行本步操作)陌知。

[centos@host ~]$ sudo dnf install openssl
[centos@host ~]$ sudo mkdir /usr/local/harbor/https
[centos@host ~]$ sudo openssl genrsa -out /usr/local/harbor/https/reg.docker.harbor.key 4096
[centos@host ~]$ sudo openssl req -x509 -new -nodes -sha512 -days 36500 \
    -subj "/C=cn/ST=sd/L=qd/O=private/OU=harbor/CN=reg.docker.harbor" \
    -key /usr/local/harbor/https/reg.docker.harbor.key \
    -out /usr/local/harbor/https/reg.docker.harbor.crt

8他托、進(jìn)入 Harbor 安裝目錄,編譯 Docker Compose 文件仆葡,編譯完成后在 Harbor 安裝目錄中自動(dòng)創(chuàng)建 "docker-compose.yml" 文件赏参。

[centos@host ~]$ cd /usr/local/harbor
[centos@host harbor]$ pwd
/usr/local/harbor
[centos@host harbor]$ sudo ./prepare
[centos@host harbor]$ ll docker-compose.yml
-rw-r--r--. 1 root root      5926 8月   7 23:44 docker-compose.yml

9、進(jìn)入"docker-compose.yml" 文件所在目錄( Harbor 安裝目錄)沿盅,執(zhí)行 Harbor 安裝腳本把篓,安裝 Harbor 的 Docker 容器。

[centos@host ~]$ cd /usr/local/harbor
[centos@host harbor]$ ll docker-compose.yml
-rw-r--r--. 1 root root      5926 8月   7 23:44 docker-compose.yml
[centos@host harbor]$ sudo ./install.sh

10腰涧、進(jìn)入"docker-compose.yml" 文件所在目錄( Harbor 安裝目錄)韧掩,查看 Harbor 的 Docker 容器運(yùn)行狀態(tài)。

[centos@host ~]$ cd /usr/local/harbor
[centos@host harbor]$ pwd
/usr/local/harbor
[centos@host harbor]$ sudo docker-compose ps
      Name                     Command                  State                 Ports          
---------------------------------------------------------------------------------------------
harbor-core         /harbor/entrypoint.sh            Up (healthy)                            
harbor-db           /docker-entrypoint.sh            Up (healthy)   5432/tcp                 
harbor-jobservice   /harbor/entrypoint.sh            Up (healthy)                            
harbor-log          /bin/sh -c /usr/local/bin/ ...   Up (healthy)   127.0.0.1:1514->10514/tcp
harbor-portal       nginx -g daemon off;             Up (healthy)   8080/tcp                 
nginx               nginx -g daemon off;             Up (healthy)   0.0.0.0:80->8080/tcp     
redis               redis-server /etc/redis.conf     Up (healthy)   6379/tcp                 
registry            /home/harbor/entrypoint.sh       Up (healthy)   5000/tcp                 
registryctl         /home/harbor/start.sh            Up (healthy)                            

注意:所有容器的 State 應(yīng)當(dāng)是 "Up (healthy)" 則表示運(yùn)行正常窖铡。

11疗锐、在瀏覽器中訪問【https://reg.docker.harbor】或者【https://192.168.0.20】訪問 Harbor 系統(tǒng)。

Harbor 倉庫登錄界面
Harbor 主界面

12费彼、創(chuàng)建 Harbor 倉庫項(xiàng)目窒悔。

第一步,在“項(xiàng)目”界面中點(diǎn)擊“新建項(xiàng)目”按鈕
第二步敌买,輸入項(xiàng)目信息后點(diǎn)擊“確定”按鈕
第三步简珠,在“用戶管理”界面中點(diǎn)擊“新建用戶”按鈕
第四步,輸入用戶信息后點(diǎn)擊“確定”按鈕
第五步虹钮,選中用戶后點(diǎn)擊“設(shè)置為管理員”按鈕
第六步聋庵,在“項(xiàng)目”界面中選中已創(chuàng)建的項(xiàng)目
第七步,在項(xiàng)目詳情頁面中選擇“成員”選項(xiàng)卡芙粱,點(diǎn)擊“+用戶”按鈕
第八步祭玉,輸入已創(chuàng)建的用戶賬號(hào),并設(shè)置用戶的角色后點(diǎn)擊“確定”按鈕
第九步春畔,用戶已加入到項(xiàng)目成員中

13脱货、進(jìn)入"docker-compose.yml" 文件所在目錄( Harbor 安裝目錄),通過 Docker Compose 對(duì) Harbor 進(jìn)行日常運(yùn)維律姨。

1)進(jìn)入"docker-compose.yml" 文件所在目錄( Harbor 安裝目錄):

[centos@host ~]$ cd /usr/local/harbor
[centos@host harbor]$ ll docker-compose.yml
-rw-r--r--. 1 root root      5926 8月   7 23:44 docker-compose.yml

2)檢查 Docker Compose 的 YAML 配置文件:

[centos@host harbor]$ docker-compose config

3)停止 Harbor 的 Docker 容器:

[centos@host harbor]$ docker-compose stop

4)啟動(dòng) Harbor 的 Docker 容器:

[centos@host harbor]$ docker-compose start

5)停止并刪除 Harbor 的 Docker 容器:

[centos@host harbor]$ docker-compose down -v

6)安裝并啟動(dòng) Harbor 的 Docker 容器:

[centos@host harbor]$ docker-compose up -d

7)重新配置并啟動(dòng) Harbor 的 Docker 容器:

[centos@host harbor]$ docker-compose down -v
[centos@host harbor]$ sudo ./prepare
[centos@host harbor]$ sudo ./install.sh

8)刪除 Harbor 的鏡像數(shù)據(jù):

[centos@host harbor]$ sudo rm -rf /data/harbor

9)查看 Harbor 的容器狀態(tài):

[centos@host harbor]$ docker-compose ps
      Name                     Command                  State                 Ports          
---------------------------------------------------------------------------------------------
harbor-core         /harbor/entrypoint.sh            Up (healthy)                            
harbor-db           /docker-entrypoint.sh            Up (healthy)   5432/tcp                 
harbor-jobservice   /harbor/entrypoint.sh            Up (healthy)                            
harbor-log          /bin/sh -c /usr/local/bin/ ...   Up (healthy)   127.0.0.1:1514->10514/tcp
harbor-portal       nginx -g daemon off;             Up (healthy)   8080/tcp                 
nginx               nginx -g daemon off;             Up (healthy)   0.0.0.0:80->8080/tcp     
redis               redis-server /etc/redis.conf     Up (healthy)   6379/tcp                 
registry            /home/harbor/entrypoint.sh       Up (healthy)   5000/tcp                 
registryctl         /home/harbor/start.sh            Up (healthy)                            

注意:所有容器的 State 應(yīng)當(dāng)是 "Up (healthy)" 則表示運(yùn)行正常振峻。


4.2.Docker 使用 Harbor 私有倉庫

1、創(chuàng)建本地 DNS 配置(當(dāng) Harbor 配置文件中【hostname】參數(shù)設(shè)置為域名時(shí)需執(zhí)行本步操作)择份。

使用文本編輯器打開本地 DNS 映射文件 "/etc/hosts":

[centos@host ~]$ sudo gedit /etc/hosts

在文件中追加配置并保存:

192.168.0.20 reg.docker.harbor

2扣孟、創(chuàng)建 Harbor Https 的 SSL 證書目錄(目錄格式:/etc/docker/certs.d/【harbor hostname】)并下載 Harbor 生成的證書文件(當(dāng) Harbor 配置文件中啟用 https 時(shí)需執(zhí)行本步操作)。

[centos@host ~]$ sudo mkdir -p /etc/docker/certs.d/reg.docker.harbor
[centos@host ~]$ sudo scp centos@192.168.0.20:/usr/local/harbor/https/reg.docker.harbor.crt /etc/docker/certs.d/reg.docker.harbor
[centos@host ~]$ ll /etc/docker/certs.d/reg.docker.harbor
-rw-r--r--. 1 root root 2033 8月  10 09:46 reg.docker.harbor.crt

3荣赶、Docker 客戶端登錄 Harbor 私有倉庫凤价。

[centos@host ~]$ docker login reg.docker.harbor
Username: zhangyi_soho  
Password: 
WARNING! Your password will be stored unencrypted in /home/centos/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

4鸽斟、Docker 客戶端推送本地鏡像到私有倉庫中,以鏡像 "hello-world" 為例利诺。

查詢鏡像的 "ImageId":

[centos@host ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        7 months ago        13.3kB

推送本地鏡像:

[centos@host ~]$ docker tag bf756fb1ae65 reg.docker.harbor/docker_store/hello-world:latest
[centos@host ~]$ docker push reg.docker.harbor/docker_store/hello-world:latest
The push refers to repository [reg.docker.harbor/docker_store/hello-world]
9c27e219663c: Pushed 
latest: digest: sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042 size: 525

在 Harbor 私有倉庫的管理頁面中查看:

在“項(xiàng)目”界面中選中已上傳鏡像的項(xiàng)目
查看已上傳的鏡像

5富蓄、Docker 客戶端從 Harbor 私有倉庫中拉取鏡像到本地,以鏡像 "hello-world" 為例慢逾。

[centos@host ~]$ docker pull reg.docker.harbor/docker_store/hello-world:latest
latest: Pulling from docker_store/hello-world
Digest: sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042
Status: Image is up to date for reg.docker.harbor/docker_store/hello-world:latest
reg.docker.harbor/docker_store/hello-world:latest

6立倍、在本地倉庫中查詢拉取容器。

[centos@host ~]$ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
reg.docker.harbor/docker_store/hello-world              latest              bf756fb1ae65        7 months ago        13.3kB

5.Docker 鏡像制作

Docker 鏡像從應(yīng)用角度一般自下而上分為三個(gè)類別:

  • 基礎(chǔ)鏡像:CentOS氛改、Ubuntu 等文件系統(tǒng)的鏡像帐萎,一般從互聯(lián)網(wǎng)的倉庫中獲取。
  • 環(huán)境鏡像:基于基礎(chǔ)鏡像制作的部署 MySQL胜卤、JDK 等中間件的鏡像铝侵,可用于直接部署應(yīng)用闲孤。
  • 應(yīng)用鏡像:基于環(huán)境鏡像制作的部署應(yīng)用產(chǎn)品的鏡像蛾洛,用于項(xiàng)目交付剧劝。

假設(shè)主機(jī) IP 地址是【192.168.0.20】,以基于 CentoOS 的 MySQL8 數(shù)據(jù)庫的 Docker 環(huán)境鏡像制作過程為例:

1舰攒、下載和安裝 Docker败富,操作過程請(qǐng)閱讀章節(jié) “2.Docker 的安裝和配置”。

2摩窃、配置和使用國內(nèi)阿里云倉庫兽叮,操作過程請(qǐng)閱讀章節(jié) “3.阿里云鏡像倉庫”。

登錄阿里云私有倉庫:

[centos@host ~]$ docker login registry.cn-hangzhou.aliyuncs.com
Username: zhangyi_soho
Password: 
WARNING! Your password will be stored unencrypted in /home/centos/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

或者在配置阿里云加速后登錄官方倉庫:

[centos@host ~]$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: zhangyisoho
Password: 
WARNING! Your password will be stored unencrypted in /home/centos/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

3猾愿、查詢倉庫中已發(fā)布的 centos 鏡像鹦聪,并拉取官方編譯版本。

1)查詢倉庫中已發(fā)布的 centos 鏡像:

[centos@host ~]$ docker search centos
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   6125                [OK]                

2)拉取 centos 官方編譯版本:

[centos@host ~]$ docker pull centos
Using default tag: latest
latest: Pulling from library/centos
Digest: sha256:4062bbdd1bb0801b0aa38e0f83dece70fb7a5e9bce223423a68de2d8b784b43b
Status: Image is up to date for centos:latest
docker.io/library/centos:latest

3)查詢本地倉庫中已拉取的 centos 鏡像:

[centos@host ~]$ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
centos                          latest              831691599b88        7 weeks ago         215MB

4蒂秘、使用 centos 創(chuàng)建一個(gè) mysql 的部署容器泽本。

[centos@host ~]$ docker run -tid --name=mysql  centos /sbin/init
a0fb0201e85d044be88d21f7a3e7882c91078802b6922142712e933192c12e3d

docker run :創(chuàng)建一個(gè)新的容器并運(yùn)行一個(gè)命令。

語法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

[OPTIONS]:
-i: 以交互模式運(yùn)行容器姻僧,通常與 -t 同時(shí)使用规丽;
-t: 為容器重新分配一個(gè)偽輸入終端,通常與 -i 同時(shí)使用撇贺。
-d: 后臺(tái)運(yùn)行容器赌莺,并返回容器ID;
-v /data/mysql:/var/lib/mysql: 掛載宿主機(jī)目錄显熏,格式為:宿主機(jī)目錄:容器目錄(非必要參數(shù)雄嚣,主要是為了使數(shù)據(jù)脫離容器存儲(chǔ),當(dāng)目錄不存在時(shí)自動(dòng)創(chuàng)建)喘蟆;
--name="mysql": 為容器指定一個(gè)名稱缓升。

IMAGE:鏡像名稱或ID。

[COMMAND]:執(zhí)行的命令蕴轨,注意要設(shè)置為 "/sbin/init"港谊,否則在容器中 "systemctl" 指令故障。

5橙弱、查看 mysql 部署容器的狀態(tài)歧寺。

[centos@host ~]$ docker ps -a
CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS                 PORTS                                         NAMES
76983aa5b182        centos                               "/sbin/init"             6 minutes ago       Up 6 minutes                                                             mysql

6、進(jìn)入 mysql 的部署容器棘脐。

[centos@optimus-prime ~]$ docker exec -it mysql /bin/bash
[root@e4599ea3ee0b /]#  uname -r         
4.18.0-193.14.2.el8_2.x86_64

docker exec :在運(yùn)行的容器中執(zhí)行命令斜筐。

語法:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

[OPTIONS]:
-i: 以交互模式運(yùn)行容器,通常與 -t 同時(shí)使用蛀缝;
-t: 為容器重新分配一個(gè)偽輸入終端顷链,通常與 -i 同時(shí)使用。

CONTAINER:容器名稱或ID屈梁。

COMMAND:執(zhí)行的命令嗤练,一般可設(shè)置為 "/bin/bash"。

7在讶、將 mysql 容器中的 centos 升級(jí)到最新版本煞抬。

[root@e4599ea3ee0b /]#  dnf update

8、在 mysql 的部署容器中安裝和配置 MySQL8 社區(qū)版數(shù)據(jù)庫构哺。

1)從 Yum 源中安裝 MySQL8 社區(qū)版:

[root@e4599ea3ee0b /]#  dnf install mysql-server mysql

2)修改 MySQL 配置文件革答,設(shè)置 MySQL 服務(wù)器為本地免密登錄模式:

使用文本編輯器打開配置文件,修改或驗(yàn)證文件中的以下參數(shù)并保存:

[root@e4599ea3ee0b /]#  vi /etc/my.cnf
[mysqld]
# 開啟以下兩項(xiàng)設(shè)置后曙强,僅能夠通過本地訪問數(shù)據(jù)庫残拐,使用超級(jí)管理員身份登錄且不需要進(jìn)行身份認(rèn)證。

# 跳過身份認(rèn)證旗扑,默認(rèn)不啟用蹦骑。
skip-grant-tables

# 跳過遠(yuǎn)程鏈接,默認(rèn)不啟用臀防。
skip-networking

3)重新啟動(dòng) MySQL 服務(wù):

[root@e4599ea3ee0b /]#  systemctl restart mysqld.service

4)免密登錄客戶端并清除"root"賬號(hào)口令:

[root@e4599ea3ee0b /]#  mysql
# 連接 mysql 數(shù)據(jù)庫眠菇,默認(rèn)數(shù)據(jù)庫。
mysql>use mysql;

# 更新 root 賬號(hào)口令為空(不能設(shè)置其他口令)袱衷。
mysql>update user set authentication_string='' where user='root';

# 退出客戶端捎废。
mysql> exit;

5)修改 MySQL 配置文件,設(shè)置 MySQL 服務(wù)器為正常啟動(dòng)模式:

使用文本編輯器打開配置文件致燥,修改或驗(yàn)證文件中的以下參數(shù)并保存:

[root@e4599ea3ee0b /]#  vi /etc/my.cnf
[mysqld]
# 開啟以下兩項(xiàng)設(shè)置后登疗,僅能夠通過本地訪問數(shù)據(jù)庫,使用超級(jí)管理員身份登錄且不需要進(jìn)行身份認(rèn)證。

# 跳過身份認(rèn)證辐益,默認(rèn)不啟用断傲。
# skip-grant-tables

# 跳過遠(yuǎn)程鏈接,默認(rèn)不啟用智政。
# skip-networking

6)重新啟動(dòng) MySQL 服務(wù):

[root@e4599ea3ee0b /]#  systemctl restart mysqld.service

7)使用"root"賬號(hào)登錄客戶端认罩,設(shè)置新的口令和策略。密碼要包含大寫字母续捂,小寫字母垦垂,數(shù)字,特殊符號(hào):

[root@e4599ea3ee0b /]#  mysql -u root

# 初始化root賬號(hào)本地登錄的口令牙瓢。
# 格式:alter user '<賬號(hào)>'@'<客戶端IP策略>' identified by '<登錄密碼>';
# 說明:
# <客戶端IP策略>可以使用通配符”%”劫拗,也可以指定具體IP地址或地址段,如:
# 允許全部遠(yuǎn)程地址訪問矾克,設(shè)置為:”%”;
# 允許IP地址訪問页慷,設(shè)置為:”192.168.0.1”;
# 允許IP地址段訪問,設(shè)置為:”192.168.0.%”聂渊。
mysql> alter user 'root'@'localhost' identified by 'password';

# 創(chuàng)建root賬號(hào)遠(yuǎn)程登錄的策略和口令差购。
# 格式:create user '<賬號(hào)>'@'<客戶端IP策略>' identified with mysql_native_password by '<登錄密碼>';
# 說明:
# <客戶端IP策略>可以使用通配符”%”,也可以指定具體IP地址或地址段汉嗽,如:
# 允許全部遠(yuǎn)程地址訪問欲逃,設(shè)置為:”%”;
# 允許IP地址訪問,設(shè)置為:”192.168.0.1”;
# 允許IP地址段訪問饼暑,設(shè)置為:”192.168.0.%”稳析。
# with mysql_native_password 表示設(shè)置的口令可同時(shí)用于遠(yuǎn)程訪問(不指定時(shí)用于本地訪問)。
mysql> create user 'root'@'%' identified with mysql_native_password by 'password';

# 格式:grant all privileges on <庫名>.<表名> to '<用戶名>'@'<客戶端IP策略>';
# 說明:
# <庫名>和<表名>可以使用通配符”*”代替弓叛,表示全部數(shù)據(jù)庫或全部表彰居;
# <客戶端IP策略>可以使用通配符”%”,也可以指定具體IP地址或地址段撰筷,如:
# 允許全部遠(yuǎn)程地址訪問陈惰,設(shè)置為:”%”;
# 允許IP地址訪問,設(shè)置為:”192.168.0.1”;
# 允許IP地址段訪問毕籽,設(shè)置為:”192.168.0.%”抬闯。
mysql> grant all on *.* to 'root'@'%';

# 刷新用戶權(quán)限。
mysql> flush privileges;

# 退出客戶端关筒。
mysql> exit;

8)設(shè)置 MySQL 服務(wù)為開機(jī)自啟動(dòng):

[root@e4599ea3ee0b /]#  systemctl enable mysqld.service

9溶握、從 mysql 的部署容器中退出并停止運(yùn)行容器。

[root@e4599ea3ee0b /]#  exit
[centos@host ~]#  docker stop mysql

10蒸播、將 mysql 部署容器制作成新的鏡像睡榆。

[centos@host ~]#  docker commit -m 'mysql8-ce' -a 'zhangyi_soho' mysql mysql8-ce:latest

docker commit :從容器創(chuàng)建一個(gè)新的鏡像萍肆。

語法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

[OPTIONS]:
-a :提交的鏡像作者;
-m :提交時(shí)的說明文字胀屿。

CONTAINER:容器名稱或ID塘揣。

[REPOSITORY[:TAG]]:鏡像名稱:版本號(hào)(版本號(hào)不指定時(shí)默認(rèn)為 "latest")。

11碉纳、查詢本地倉庫中已創(chuàng)建的 mysql 鏡像勿负。

[centos@host ~]$ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
mysql8-ce                       latest                  0ceef1020774        7 minutes ago       700MB

12馏艾、刪除 mysql 部署容器(一般情況下劳曹,完成鏡像制作后無需保留部署容器,但刪除與否并無其他影響)琅摩。

[centos@host ~]$ docker rm mysql

13铁孵、使用 mysql8-ce 鏡像創(chuàng)建一個(gè) mysql8 的實(shí)例容器,并建立宿主機(jī)和容器的掛載目錄和服務(wù)端口映射房资。

[centos@host ~]$ docker run -d -p 3306:3306 -v /data/mysql:/var/lib/mysql --name=mysql8-ce-1 mysql8-ce:latest /sbin/init
a0fb0201e85d044be88d21f7a3e7882c91078802b6922142712e933192c12e3d

docker run :創(chuàng)建一個(gè)新的容器并運(yùn)行一個(gè)命令蜕劝。

語法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

[OPTIONS]:
-d: 后臺(tái)運(yùn)行容器,并返回容器ID轰异;
-p 3306:3306: 端口映射岖沛,格式為:主機(jī)(宿主)端口:容器端口;
-v /data/mysql:/var/lib/mysql: 掛載宿主機(jī)目錄搭独,格式為:宿主機(jī)目錄:容器目錄(非必要參數(shù)婴削,主要是為了使數(shù)據(jù)脫離容器存儲(chǔ),當(dāng)目錄不存在時(shí)自動(dòng)創(chuàng)建)牙肝;
--name="mysql8-ce-1": 為容器指定一個(gè)名稱唉俗。

IMAGE:鏡像名稱或ID。

[COMMAND]:執(zhí)行的命令配椭,注意要設(shè)置為 "/sbin/init"虫溜,否則在容器中 "systemctl" 指令故障。

創(chuàng)建容器的常見方式包括:

1)掛載宿主機(jī)目錄:

[centos@host ~]$ docker run -d -p 3306:3306 -v /data/mysql:/var/lib/mysql --name=mysql8-ce-1 mysql8-ce:latest /sbin/init
a0fb0201e85d044be88d21f7a3e7882c91078802b6922142712e933192c12e3d

2)不掛載宿主機(jī)目錄:

[centos@host ~]$ docker run -d -p 3306:3306 --name=mysql8-ce-1 mysql8-ce:latest /sbin/init
a0fb0201e85d044be88d21f7a3e7882c91078802b6922142712e933192c12e3d

14股缸、進(jìn)入 mysql8 的實(shí)例容器修改掛載目錄的所有者衡楞。(當(dāng)使用掛載宿主機(jī)目錄時(shí)操作)

1)進(jìn)入實(shí)例容器,修改掛載目錄的所有者:

[centos@host ~]$ docker exec -it mysql8-ce-1 /bin/bash
[root@097fc4904b89 /]# chown -R mysql:mysql /var/lib/mysql

2)按照“8敦姻、在 mysql 的部署容器中安裝和配置 MySQL8 社區(qū)版數(shù)據(jù)庫瘾境。”的操作步驟替劈,重新配置 MySQL8 數(shù)據(jù)庫寄雀。

15、使用 Dockerfile 制作鏡像陨献。

Docker 提供一種通過編寫 Dockerfile 文件來自動(dòng)創(chuàng)建鏡像的方法盒犹,但應(yīng)用場(chǎng)景并不廣泛。制作 Docker 鏡像的初衷是為了將復(fù)雜的部署過程進(jìn)行簡(jiǎn)化,并且在部署過程中仍然需要反復(fù)調(diào)試急膀,如果把部署過程編寫成 Dockerfile 文件來完成這項(xiàng)工作沮协,在較為普遍情況下其實(shí)會(huì)增加制作和調(diào)試的難度,因此本文并不推薦這種制作方案卓嫂,但并不排除在特定的應(yīng)用場(chǎng)景中慷暂,使用 Dockerfile 制作鏡像的優(yōu)勢(shì)和可行性。

Dockerfile 制作鏡像請(qǐng)閱讀文件【https://www.runoob.com/docker/docker-dockerfile.html


6.Docker 鏡像打包晨雳、導(dǎo)入和運(yùn)行

以在 “5.Docker 鏡像制作” 章節(jié)中制作的鏡像 "mysql8-ce" 為例:

1行瑞、查詢本地倉庫中的 mysql8-ce 鏡像信息。

[centos@host ~]$ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
mysql8-ce                       v1.0.0                  0ceef1020774        7 minutes ago       700MB

2餐禁、將 mysql8-ce 鏡像打包成 tar 包到指定目錄中血久。

[centos@host ~]$ docker save -o ~/mysql8-ce.tar mysql8-ce
[centos@host ~]$ ll mysql8-ce.tar
-rw-------. 1 centos centos 710726144 8月  10 16:14 mysql8-ce.tar

docker save : 將指定鏡像保存成 tar 歸檔文件。

語法:docker save [OPTIONS] IMAGE [IMAGE...]

[OPTIONS]:
-o :輸出到的文件帮非。

IMAGE:鏡像名稱或ID氧吐,多個(gè)鏡像使用空格分隔。

3末盔、將鏡像打包文件 mysql8-ce.tar 導(dǎo)入到 Docker 中筑舅。

[centos@host ~]$ docker load -i ~/mysql8-ce.tar

docker load : 導(dǎo)入使用 docker save 命令導(dǎo)出的鏡像。

語法:docker load [OPTIONS]

[OPTIONS]:
--input , -i : 指定導(dǎo)入的文件陨舱。

4翠拣、使用鏡像創(chuàng)建一個(gè)實(shí)例容器。

1)掛載宿主機(jī)目錄:

[centos@host ~]$ docker run -d -p 3306:3306 -v /data/mysql:/var/lib/mysql --name=mysql8-ce-1 mysql8-ce:latest /sbin/init
a0fb0201e85d044be88d21f7a3e7882c91078802b6922142712e933192c12e3d

2)不掛載宿主機(jī)目錄:

[centos@host ~]$ docker run -d -p 3306:3306 --name=mysql8-ce-1 mysql8-ce:latest /sbin/init
a0fb0201e85d044be88d21f7a3e7882c91078802b6922142712e933192c12e3d

docker run :創(chuàng)建一個(gè)新的容器并運(yùn)行一個(gè)命令隅忿。

語法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

[OPTIONS]:
-d: 后臺(tái)運(yùn)行容器心剥,并返回容器ID;
-i: 以交互模式運(yùn)行容器背桐,通常與 -t 同時(shí)使用优烧;
-t: 為容器重新分配一個(gè)偽輸入終端,通常與 -i 同時(shí)使用链峭;
-p 3306:3306: 端口映射畦娄,格式為:主機(jī)(宿主)端口:容器端口;
-v /data/mysql:/var/lib/mysql: 掛載宿主機(jī)目錄弊仪,格式為:宿主機(jī)目錄:容器目錄(非必要參數(shù)熙卡,主要是為了使數(shù)據(jù)脫離容器存儲(chǔ),當(dāng)目錄不存在時(shí)自動(dòng)創(chuàng)建)励饵;
--name="mysql8-ce-1": 為容器指定一個(gè)名稱驳癌。

IMAGE:鏡像名稱或ID。

[COMMAND]:執(zhí)行的命令役听,注意要設(shè)置為 "/sbin/init"颓鲜,否則在容器中 "systemctl" 指令故障表窘。

4、進(jìn)入創(chuàng)建一個(gè)實(shí)例容器甜滨。

[centos@optimus-prime ~]$ docker exec -it mysql8-ce-1 /bin/bash
[root@e4599ea3ee0b /]#

docker exec :在運(yùn)行的容器中執(zhí)行命令乐严。

語法:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

[OPTIONS]:
-i: 以交互模式運(yùn)行容器,通常與 -t 同時(shí)使用衣摩;
-t: 為容器重新分配一個(gè)偽輸入終端昂验,通常與 -i 同時(shí)使用。

CONTAINER:容器名稱或ID艾扮。

COMMAND:執(zhí)行的命令既琴,一般可設(shè)置為 "/bin/bash"。


7.Docker Compose 容器編排

Docker Compose 是用于定義和運(yùn)行多容器 Docker 應(yīng)用程序的工具栏渺。通過 Docker Compose 可以使用 YAML 文件來配置應(yīng)用程序需要的所有服務(wù)呛梆。然后,使用一個(gè)命令磕诊,就可以從 YAML 文件配置中創(chuàng)建并啟動(dòng)所有服務(wù)。

7.1.Docker Compose 的安裝和配置

1纹腌、下載和安裝 Docker霎终,操作過程請(qǐng)閱讀章節(jié) “2.Docker 的安裝和配置”。

2升薯、配置和使用國內(nèi)阿里云倉庫莱褒,操作過程請(qǐng)閱讀章節(jié) “3.阿里云鏡像倉庫”。

登錄阿里云私有倉庫:

[centos@host ~]$ docker login registry.cn-hangzhou.aliyuncs.com
Username: zhangyi_soho
Password: 
WARNING! Your password will be stored unencrypted in /home/centos/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

或者在配置阿里云加速后登錄官方倉庫:

[centos@host ~]$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: zhangyisoho
Password: 
WARNING! Your password will be stored unencrypted in /home/centos/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

3涎劈、打開 Docker Compose 下載頁面【https://github.com/docker/compose/releases】广凸,下載 Docker Compose 的編譯程序到用戶主目錄中。

Docker Compose 下載頁面

下載后將 Docker Compose 編譯程序安裝到 "/usr/local/bin" 目錄中:

[centos@host ~]$ sudo mv ~/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose

或者通過 "curl" 指令下載并安裝:

[centos@host ~]$ sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

4蛛枚、授予程序可行性權(quán)限谅海,并建立軟鏈接到系統(tǒng)默認(rèn)的 shell 目錄中 "/usr/bin"。

[centos@host ~]$ sudo chmod +x /usr/local/bin/docker-compose
[centos@host ~]$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

5蹦浦、創(chuàng)建工作目錄扭吁。

[centos@host ~]$ sudo mkdir -p /data/docker-compose

6、測(cè)試是否安裝成功盲镶。

[centos@host ~]$ docker-compose --version
docker-compose version 1.26.2, build eefe0d31

7.2.Docker Compose 容器編排

假設(shè)主機(jī) IP 地址是【192.168.0.20】侥袜,基于 Docker 實(shí)現(xiàn)【W(wǎng)eb 連接 MySQL】的 Docker Compose 鏡像制作和容器編排過程為例:

1、Docker 容器規(guī)劃溉贿。

1)MySQL 數(shù)據(jù)庫容器:

  • 操作系統(tǒng):CentOS8
  • 安裝程序:MySQL8
  • 暴露 IP 和 PORT:127.0.0.1:3306

2)Tomcat 應(yīng)用容器:

  • 操作系統(tǒng):CentOS8
  • 安裝程序:Oracle JDK枫吧,Tomcat
  • 暴露 IP 和 PORT:0.0.0.0:3306
  • 掛載宿主機(jī)目錄:/data/tomcat/webapps

2、制作 MySQL8 社區(qū)版的 Docker 鏡像宇色。

按照 “5.Docker 鏡像制作” 章節(jié)的第 3-12 步制作 MySQL8 社區(qū)版的 Docker 鏡像九杂。

3闽寡、制作 Tomcat 的 Docker 鏡像。

1)下載 Oracle JDK尼酿,Tomcat 到主機(jī)用戶主目錄爷狈。

打開 Oracle JDK 官方網(wǎng)站下載頁面【https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html】,下載 Oracle JDK 的編譯程序 tar 包到用戶主目錄中:

Oracle JDK 下載頁面

打開 Tomcat 官方網(wǎng)站下載頁面【https://tomcat.apache.org/download-90.cgi】裳擎,下載 Tomcat 的編譯程序 tar 包到用戶主目錄中:

Tomcat 下載頁面

2)拉取 centos 鏡像:

[centos@host ~]$ docker pull centos
Using default tag: latest
latest: Pulling from library/centos
Digest: sha256:4062bbdd1bb0801b0aa38e0f83dece70fb7a5e9bce223423a68de2d8b784b43b
Status: Image is up to date for centos:latest
docker.io/library/centos:latest

3)使用 centos 創(chuàng)建一個(gè) tomcat 的部署容器:

[centos@host ~]$ docker run -tid --name=tomcat centos /sbin/init
8b66309840f982398528f39744b92f0cdfdabac8d8ce7fb4d1da9ed1c27299bb

4)查詢 tomcat 的部署容器:

[centos@host ~]$ docker ps
CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS                          PORTS                       NAMES
8b66309840f9        centos                               "/sbin/init"             18 minutes ago      Up 18 minutes                                               tomcat

5)從宿主機(jī)的用戶主目錄拷貝 Oracle JDK涎永,Tomcat 的編譯程序 tar 包到 tomcat 部署容器的用戶主目錄:

[centos@host ~]$ docker cp ~/jdk-8u261-linux-x64.tar.gz 8b66309840f9:/root
[centos@host ~]$ docker cp ~/apache-tomcat-9.0.37.tar.gz 8b66309840f9:/root

6)進(jìn)入 tomcat 的部署容器:

[centos@host  ~]$ docker exec -it tomcat /bin/bash
[root@8b66309840f9 /]# 

7)安裝 net-tools 工具:

[root@8b66309840f9 /]# dnf install net-tools

8)解壓縮 Oracle JDK 和 Tomcat 的編譯程序 tar 包到"/usr/local"目錄中,并設(shè)置程序安裝目錄的所有者用戶和組為"root"鹿响,之后刪除 tar 包:

[root@8b66309840f9 /]# tar zxvf ~/jdk-8u261-linux-x64.tar.gz -C /usr/local
[root@8b66309840f9 /]# chown root:root /usr/local/jdk1.8.0_261
[root@8b66309840f9 /]# rm -f ~/jdk-8u261-linux-x64.tar.gz
[root@8b66309840f9 /]# tar zxvf ~/apache-tomcat-9.0.37.tar.gz -C /usr/local
[root@8b66309840f9 /]# mv /usr/local/apache-tomcat-9.0.37 /usr/local/tomcat-9.0.37
[root@8b66309840f9 /]# chown root:root /usr/local/tomcat-9.0.37
[root@8b66309840f9 /]# rm -f ~/apache-tomcat-9.0.37.tar.gz

9)創(chuàng)建 Tomcat 開機(jī)啟動(dòng)服務(wù)配置文件:

使用文本編輯器打開配置文件:

[root@8b66309840f9 /]# vi /usr/lib/systemd/system/tomcat.service

在文件中編寫以下內(nèi)容并保存:

[Unit]
Description=Tomcat Server
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
Type=forking
User=root
Group=root

Environment=JAVA_HOME=/usr/local/jdk1.8.0_261
Environment=JRE_HOME=/usr/local/jdk1.8.0_261/jre

ExecStart=/usr/local/tomcat-9.0.37/bin/startup.sh
ExecStop=/usr/local/tomcat-9.0.37/bin/shutdown.sh
ExecReload=/usr/local/tomcat-9.0.37/bin/shutdown.sh

10)啟動(dòng) Tomcat 服務(wù)羡微,并設(shè)置為開機(jī)自動(dòng)啟動(dòng):

[root@8b66309840f9 /]# systemctl daemon-reload
[root@8b66309840f9 /]# systemctl start tomcat.service
[root@8b66309840f9 /]# systemctl enable tomcat.service

11)查看 Tomcat 服務(wù)的狀態(tài):

[root@ed204fd330f3 /]# systemctl status tomcat.service
tomcat.service - Tomcat Server
   Loaded: loaded (/usr/lib/systemd/system/tomcat.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2020-08-26 01:44:25 UTC; 3s ago
  Process: 323 ExecStart=/usr/local/tomcat-9.0.37/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 331 (java)
    Tasks: 30 (limit: 23668)
   Memory: 109.7M
   CGroup: /docker/8b66309840f982398528f39744b92f0cdfdabac8d8ce7fb4d1da9ed1c27299bb/system.slice/tomcat.service
           └─331 /usr/local/jdk1.8.0_261/jre/bin/java -Djava.util.logging.config.file=/usr/local/tomcat-9.0.37/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoade>

Aug 26 01:44:25 8b66309840f9 systemd[1]: Starting Tomcat Server...
Aug 26 01:44:25 8b66309840f9 startup.sh[323]: Tomcat started.
Aug 26 01:44:25 8b66309840f9 systemd[1]: Started Tomcat Server.
[root@ed204fd330f3 /]# netstat -ntap | grep 8080
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      383/java

12)從 tomcat 的部署容器中退出并停止運(yùn)行容器。

[root@8b66309840f9 /]#  exit
[centos@host ~]#  docker stop tomcat

13)將 tomcat 部署容器制作成新的鏡像惶我。**

[centos@host ~]#  docker commit -m 'tomcat' -a 'zhangyi_soho' tomcat tomcat:latest
sha256:7e20454c6138aa2bd76d41d0c026e151a997c8c0a29e4f71db0a21a86e06ea51

14)查詢本地倉庫中已創(chuàng)建的 tomcat 鏡像妈倔。

[centos@host ~]$ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
tomcat                          latest              7e20454c6138        14 seconds ago      615MB

4、制作 Docker Compose 容器編排 YAML 文件绸贡。

1)在 Docker Compose 工作目錄中創(chuàng)建 "WebApp" 項(xiàng)目目錄:

[centos@host ~]$ sudo mkdir -p /data/docker-compose/webapp

2)創(chuàng)建 Docker Compose 的容器編排 YAML 文件:

使用文本編輯器打開配置文件:

[centos@host ~]$ sudo gedit /data/docker-compose/webapp/docker-compose.yaml

在文件中編寫以下內(nèi)容并保存(刪除注釋):

# 表示 YAML 文件的語法版本盯蝴。
version: '3.7'
# 表示項(xiàng)目中編排的服務(wù)集合,每個(gè)服務(wù)定義了一個(gè)容器的啟動(dòng)參數(shù)听怕。
services:
  # 服務(wù)名稱(唯一標(biāo)識(shí))
  web:
    # 服務(wù)使用的鏡像捧挺。
    image: tomcat:latest
    # 當(dāng)指定為 true 時(shí),容器中的 "root" 用戶具備根管理員權(quán)限尿瞭,當(dāng)指定為 false 時(shí)闽烙,只具備普通用戶的權(quán)限。
    privileged: true
    # 服務(wù)暴露的端口號(hào)声搁,格式為:主機(jī)(宿主)端口:容器端口黑竞。
    ports:
     - 8080:8080
    # 服務(wù)掛載的宿主機(jī)目錄,格式為:宿主機(jī)目錄:容器目錄疏旨。
    volumes:
     - /data/webapps:/usr/local/tomcat-9.0.37/webapps
    # 啟動(dòng)時(shí)依賴的服務(wù)很魂,影響部署順序。
    depends_on:
     - mysql
  mysql:
    image: mysql8-ce:latest
    privileged: true
    ports:
     - 127.0.0.1:3306:3306
    volumes:
     - /data/mysql:/var/lib/mysql

注意:當(dāng)使用掛載目錄時(shí)充石,需要在制作鏡像時(shí)提前創(chuàng)建好主機(jī)目錄莫换,并將鏡像目錄中的數(shù)據(jù)拷貝到主機(jī)目錄中,否則在使用鏡像創(chuàng)建容器時(shí)骤铃,該目錄會(huì)數(shù)據(jù)缺失拉岁。

在本例中,當(dāng)制作 Tomcat 和 MySQL 鏡像完成并退出部署容器后惰爬,需要執(zhí)行以下操作:

[centos@host ~]$ mkdir /data
[centos@host ~]$ docker cp e4599ea3ee0b:/var/lib/mysql /data/
[centos@host ~]$ docker cp 8b66309840f9:/usr/local/tomcat-9.0.37/webapps /data/

3)進(jìn)入 "WebApp" 項(xiàng)目目錄喊暖,檢查 YAML 文件,啟動(dòng)服務(wù)撕瞧,查看服務(wù)狀態(tài):

[centos@host ~]$ cd /data/docker-compose/webapp

[centos@host webapp]$ docker-compose config

[centos@host webapp]$ docker-compose up -d
Creating webapp_mysql_1 ... done
Creating webapp_web_1   ... done

[centos@host webapp]$ docker-compose ps
webapp_mysql_1   /sbin/init   Up      127.0.0.1:3306->3306/tcp
webapp_web_1     /sbin/init   Up      0.0.0.0:8080->8080/tcp

注意:所有容器的 State 應(yīng)當(dāng)是 "Up" 則表示運(yùn)行正常陵叽。

5狞尔、Docker Compose 編排容器的管理和運(yùn)維。

1)進(jìn)入 Docker Compose 的項(xiàng)目目錄(以 "WebApp" 項(xiàng)目為例):

[centos@host ~]$ cd /data/docker-compose/webapp
[centos@host webapp]$ ll docker-compose.yaml
-rw-r--r--. 1 root root      5926 8月   7 23:44 docker-compose.yaml

2)檢查 Docker Compose 的 YAML 配置文件:

[centos@host webapp]$ docker-compose config

3)停止 Docker 容器:

[centos@host webapp]$ docker-compose stop

4)啟動(dòng) Docker 容器:

[centos@host webapp]$ docker-compose start

5)停止并刪除 Docker 容器:

[centos@host webapp]$ docker-compose down -v

6)安裝并啟動(dòng) Docker 容器:

[centos@host webapp]$ docker-compose up -d

7)重新配置并啟動(dòng) Docker 容器:

[centos@host webapp]$ docker-compose down -v
[centos@host webapp]$ docker-compose up -d

8)查看容器狀態(tài):

[centos@host webapp]$ docker-compose ps
webapp_mysql_1   /sbin/init   Up      127.0.0.1:3306->3306/tcp
webapp_web_1     /sbin/init   Up      0.0.0.0:8080->8080/tcp

注意:所有容器的 State 應(yīng)當(dāng)是 "Up" 則表示運(yùn)行正常巩掺。

YAML 編寫規(guī)范請(qǐng)閱讀文章【https://www.runoob.com/w3cnote/yaml-intro.html

Docker Compose 編寫規(guī)范請(qǐng)閱讀文章【https://www.runoob.com/docker/docker-compose.html】偏序、【http://www.dockerinfo.net/docker-compose-%e9%a1%b9%e7%9b%ae


附錄一 相關(guān)技術(shù)指南目錄


附錄二 安裝 Xfce 桌面環(huán)境和 VNC 遠(yuǎn)程桌面

假設(shè)主機(jī) IP 地址是【192.168.0.20】,以基于 CentoOS 的 Xfce + tigervnc 的 Docker 環(huán)境鏡像制作過程為例:

1胖替、下載和安裝 Docker研儒,操作過程請(qǐng)閱讀章節(jié) “2.Docker 的安裝和配置”。

2独令、配置和使用國內(nèi)阿里云倉庫端朵,操作過程請(qǐng)閱讀章節(jié) “3.阿里云鏡像倉庫”。

登錄阿里云私有倉庫:

[centos@host ~]$ docker login registry.cn-hangzhou.aliyuncs.com
Username: zhangyi_soho
Password: 
WARNING! Your password will be stored unencrypted in /home/centos/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

或者在配置阿里云加速后登錄官方倉庫:

[centos@host ~]$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: zhangyisoho
Password: 
WARNING! Your password will be stored unencrypted in /home/centos/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

3燃箭、查詢倉庫中已發(fā)布的 centos 鏡像冲呢,并拉取官方編譯版本。

1)查詢倉庫中已發(fā)布的 centos 鏡像:

[centos@host ~]$ docker search centos
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   6125                [OK]                

2)拉取 centos 官方編譯版本:

[centos@host ~]$ docker pull centos
Using default tag: latest
latest: Pulling from library/centos
Digest: sha256:4062bbdd1bb0801b0aa38e0f83dece70fb7a5e9bce223423a68de2d8b784b43b
Status: Image is up to date for centos:latest
docker.io/library/centos:latest

3)查詢本地倉庫中已拉取的 centos 鏡像:

[centos@host ~]$ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
centos                          latest              831691599b88        7 weeks ago         215MB

4招狸、使用 centos 創(chuàng)建一個(gè) desktop 的部署容器敬拓。

[centos@host ~]$ docker run -tid -p 5901:5901 -p 6901:6901 --name=desktop  centos /sbin/init
a0fb0201e85d044be88d21f7a3e7882c91078802b6922142712e933192c12e3d

5、查看 desktop 部署容器的狀態(tài)。

[centos@host ~]$ docker ps -a
CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS                 PORTS                                         NAMES
76983aa5b182        centos                               "/sbin/init"             6 minutes ago       Up 6 minutes                                                         desktop

6芝此、進(jìn)入 desktop 的部署容器。

[centos@optimus-prime ~]$ docker exec -it desktop /bin/bash

7、將 desktop 容器中的 centos 升級(jí)到最新版本因悲。

[root@e4599ea3ee0b /]#  dnf update

8、在 desktop 的部署容器中安裝 EPEL 的 YUM 源缩挑。

[root@e4599ea3ee0b /]#  dnf install epel-release

9钠绍、在 desktop 的部署容器中安裝和配置 xfce 桌面系統(tǒng)。

1)搜索 xfce 程序組名稱和安裝狀態(tài):

[root@e4599ea3ee0b /]#  dnf grouplist
Last metadata expiration check: 0:46:01 ago on Tue Nov 10 07:56:44 2020.
Available Environment Groups:
   Server with GUI
   Server
   Minimal Install
   Workstation
   KDE Plasma Workspaces
   Virtualization Host
   Custom Operating System
Available Groups:
   Container Management
   .NET Core Development
   RPM Development Tools
   Development Tools
   Graphical Administration Tools
   Headless Management
   Legacy UNIX Compatibility
   Network Servers
   Scientific Support
   Security Tools
   Smart Card Support
   System Tools
   Fedora Packager
   Xfce

2)安裝 xfce 程序組:

[root@e4599ea3ee0b /]#  dnf groupinstall Xfce

10醒第、在 desktop 的部署容器中安裝和配置 vnc 遠(yuǎn)程桌面渔嚷。

1)安裝 vnc 服務(wù)器:

[root@e4599ea3ee0b /]#  dnf install tigervnc-server

2)從模板拷貝遠(yuǎn)程桌面服務(wù)實(shí)例的配置文件:

[root@e4599ea3ee0b /]#  cp /lib/systemd/system/vncserver@.service /lib/systemd/system/vncserver@:1.service

注意:程桌面服務(wù)實(shí)例配置文件的命名規(guī)則為:vncserver@[:1].service。
其中 [:1] 表示端口號(hào)的最后一位稠曼,本例對(duì)應(yīng)的服務(wù)端口號(hào)是 "5901" 和 "6901"形病。 如為 [:2],則表示監(jiān)聽端口為 "5902" 和 "6902"霞幅。

3)編輯遠(yuǎn)程桌面服務(wù)實(shí)例的配置文件漠吻,將文件中 "<USER>" 占位符替換成遠(yuǎn)程桌面的訪問用戶:

使用文本編輯器打開配置文件:

[root@e4599ea3ee0b /]#  vi /lib/systemd/system/vncserver@:1.service

將 "<USER>" 替換成遠(yuǎn)程桌面的訪問用戶,本例中應(yīng)替換為 "root":

[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=simple

# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/bin/vncserver_wrapper <USER> %i
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

[Install]
WantedBy=multi-user.target

4)設(shè)置遠(yuǎn)程桌面訪問用戶的 VNC 口令司恳,必須將訪問用戶作為當(dāng)前用戶執(zhí)行:

[root@e4599ea3ee0b /]#  vncpasswd

5)啟動(dòng)遠(yuǎn)程桌面服務(wù)實(shí)例并設(shè)置為開機(jī)啟動(dòng):

[root@e4599ea3ee0b /]#  systemctl daemon-reload
[root@e4599ea3ee0b /]#  systemctl enable vncserver@:1.service --now

6)修改遠(yuǎn)程桌面訪問用戶的 VNC 配置:

使用文本編輯器打開配置文件:

[root@e4599ea3ee0b /]#  vi ~/.vnc/xstartup

編寫內(nèi)容如下:

#!/bin/sh
# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
startxfce4 &

7)重新啟動(dòng)遠(yuǎn)程桌面服務(wù)實(shí)例:

[root@e4599ea3ee0b /]#  systemctl restart vncserver@:1.service

11途乃、在客戶端通過 vnc-viewer 等遠(yuǎn)程桌面客戶端工具訪問。

第一步扔傅,輸入宿主機(jī)地址和暴露端口耍共,服務(wù)實(shí)例端口 5901 對(duì)應(yīng)用戶 "root"

第二步烫饼,輸入 VNC 服務(wù)實(shí)例訪問用戶的口令
第三步,登錄成功

附錄三 擴(kuò)展 CentOS 基礎(chǔ)鏡像

1试读、使用 centos 鏡像創(chuàng)建一個(gè)部署容器杠纵。

[centos@host ~]$ docker run -tid --name=centos-extra centos /sbin/init
a0fb0201e85d044be88d21f7a3e7882c91078802b6922142712e933192c12e3d

注意:

  1. [COMMAND] 參數(shù)指定為 "/sbin/init",否則無法使用 "systemctl" 工具管理開機(jī)啟動(dòng)服務(wù)钩骇。

2比藻、進(jìn)入部署容器。

[centos@host ~]$ docker exec -it centos-extra /bin/bash

3伊履、設(shè)置中國時(shí)區(qū)韩容。

[root@e4599ea3ee0b /]#  cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[root@e4599ea3ee0b /]#  echo Asia/Shanghai > /etc/timezone

4、更新系統(tǒng)軟件唐瀑。

[root@e4599ea3ee0b /]#  dnf update

5群凶、安裝 EPEL 的 Yum 源。

[root@e4599ea3ee0b /]#  dnf install epel-release

6哄辣、安裝常用運(yùn)維工具请梢。

[root@e4599ea3ee0b /]#  dnf install net-tools wget curl telnet  passwd zip unzip openssh-server make gcc java-1.8.0 python3 perl

說明:

  1. net-tools:常用的網(wǎng)絡(luò)運(yùn)維工具包,如:ifconfig力穗,netstat毅弧,ping 命令等。
  2. wget:一個(gè)文件下載命令行工具当窗。
  3. telnet:一個(gè)遠(yuǎn)程主機(jī)端口訪問工具够坐。
  4. curl:一個(gè)的網(wǎng)頁瀏覽命令行工具。
  5. passwd:用于修改系統(tǒng)用戶的口令崖面。
  6. zip,unzip:ZIP 文件壓縮和解壓縮工具元咙。
  7. openssh-server:用于提供 ssh 遠(yuǎn)程訪問服務(wù)。
  8. gcc:C/C++編譯器巫员,用來將源代碼編譯成可發(fā)布的軟件程序庶香。
  9. make:工程管理工具,能夠根據(jù) Makefile 中的腳本執(zhí)行編譯简识、安裝流程赶掖。
  10. java-1.8.0-openjdk:JAVA 運(yùn)行環(huán)境。
  11. python3:Python3 運(yùn)行環(huán)境七扰。
  12. perl:Perl 運(yùn)行環(huán)境奢赂。

7、設(shè)置 root 用戶的口令(用于通過 ssh 服務(wù)登錄時(shí)使用)戳寸。

[root@e4599ea3ee0b /]#  passwd

8呈驶、啟動(dòng) ssh 服務(wù)并設(shè)置為開機(jī)自啟動(dòng)。

[root@e4599ea3ee0b /]# systemctl enable sshd --now

9疫鹊、創(chuàng)建默認(rèn)的分離數(shù)據(jù)掛載目錄袖瞻。

[root@e4599ea3ee0b /]# mkdir /data

10司致、清除歷史命令并退出。

[root@e4599ea3ee0b /]# history -c && exit

11聋迎、關(guān)閉容器脂矫,提交成新的鏡像,刪除容器(若適用)霉晕。

[centos@host ~]$ docker stop centos-extra
[centos@host ~]$ docker commit -m 'centos-extra' -a 'zhangyisoho' centos-extra centos-extra-x86_64
[centos@host ~]$ docker rm centos-extra
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末庭再,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子牺堰,更是在濱河造成了極大的恐慌拄轻,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伟葫,死亡現(xiàn)場(chǎng)離奇詭異恨搓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)筏养,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門斧抱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渐溶,你說我怎么就攤上這事辉浦。” “怎么了茎辐?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵宪郊,是天一觀的道長。 經(jīng)常有香客問我拖陆,道長废膘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任慕蔚,我火速辦了婚禮,結(jié)果婚禮上斋配,老公的妹妹穿的比我還像新娘孔飒。我一直安慰自己,他們只是感情好艰争,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布坏瞄。 她就那樣靜靜地躺著,像睡著了一般甩卓。 火紅的嫁衣襯著肌膚如雪鸠匀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天逾柿,我揣著相機(jī)與錄音缀棍,去河邊找鬼宅此。 笑死,一個(gè)胖子當(dāng)著我的面吹牛爬范,可吹牛的內(nèi)容都是我干的父腕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼青瀑,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼璧亮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起斥难,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤枝嘶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后哑诊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體群扶,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年搭儒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了穷当。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡淹禾,死狀恐怖馁菜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铃岔,我是刑警寧澤汪疮,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站毁习,受9級(jí)特大地震影響智嚷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纺且,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一盏道、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧载碌,春花似錦猜嘱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至步咪,卻和暖如春论皆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國打工点晴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留感凤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓觉鼻,卻偏偏與公主長得像俊扭,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坠陈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容