Docker 從入門到掉坑

Java知音_發表於2020-01-22

Docker 介紹

簡單的對docker進行介紹,可以把它理解為一個應用程式執行的容器。但是docker本身和虛擬機器還是有較為明顯的出入的。我大致歸納了一下,可以總結為以下幾點:

Docker 從入門到掉坑


docker自身也有著很多的優點,關於它的優點,可以總結為以下幾項:

 

Docker 從入門到掉坑

安裝docker

從 2017 年 3 月開始 docker 在原來的基礎上分為兩個分支版本: Docker CE 和 Docker EE。

Docker CE 即社群免費版,Docker EE 即企業版,強調安全,但需付費使用。

首先我們需要移除舊的docker版本:

$ sudo yum remove docker 
                  docker-client 
                  docker-client-latest 
                  docker-common 
                  docker-latest 
                  docker-latest-logrotate 
                  docker-logrotate 
                  docker-selinux 
                  docker-engine-selinux 
                  docker-engine

接著我們需要安裝一些必要的系統工具:

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

接下來我們需要新增軟體源資訊:

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新 yum 快取:

sudo yum makecache fast

驗證容器

上邊的操作都是一些準備操作,如果步驟過程中沒有出現什麼異常的話,後邊就可以安裝docker了

sudo yum -y install docker-ce

安裝完畢之後便是開啟docker後臺服務步驟:

sudo systemctl start docker

當我們的docker映象下載完畢之後,預設會有個helloworld的映象用於測試:

測試執行 hello-world

[root@runoob ~]# docker run hello-world

由於本地沒有hello-world這個映象,所以會下載一個hello-world的映象,並在容器內執行。

關於docker的映象和容器介紹

容器的本質就是程式,不同的容器有著自己獨立的root檔案系統,網路配置,一個隔離的空間。容器一旦消失,則裡面包含的資料也會發生丟失。容器裡面所有的儲存資訊都應該使用資料卷或者其他形式。資料卷的生存週期獨立於容器,容器消亡,資料卷不會消亡。因此,使用資料卷後,容器刪除或者重新執行之後,資料卻不會丟失。

Docker 映象是一個特殊的檔案系統,除了提供容器執行時所需的程式、庫、資源、配置等檔案外,還包含了一些為執行時準備的一些配置引數(如匿名卷、環境變數、使用者等)。映象不包含任何動態資料,其內容在構建之後也不會被改變。

docker安裝nginx

初步安裝完了docker之後便開始進入一些實戰環節吧

首先我們需要在docker裡面pull相關的nginx映象:

一開始宿主機並沒有啟動docker容器,需要啟動docker服務

service docker start

然後pull映象下來,並且啟動

docker run -d -p 80:80 --restart=always nginx:latest

引數講解:-d 後臺啟動 -p 宿主機的80埠對映容器的80埠。測試一下相關頁面,成功則如下圖:

Docker 從入門到掉坑

 

接下來我們可以檢視一下映象標籤

 

docker images

這個命令查詢出來的只是映象的id,但是我們無法根據映象id進入容器中,進入容器需要有容器的id才可以:

於是可以通過這個命令來檢視容器的id:

docker ps

然後進入容器修改資訊
進入容器的命令有很多種,這裡推薦可以使用這種型別:

docker exec -it 999318c7d567 /bin/bash

通過選擇相應的tag-id進入容器,進入到容器裡面之後,會發現裡面彷彿就是一個新的linux作業系統:

Docker 從入門到掉坑

如何關閉docker容器?

比較簡單,這裡不多說,自己操作就懂了

docker kill 4591552a4185

檔案拷貝

懂得了基本的docker容器操作之後,我們來試試如何上傳檔案到docker容器中,這個需要和宿主機進行檔案交換才可以。

首先我們需要拿到容器id的全稱:

[root@localhost html]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
0d4173ecf31f        nginx:latest        "nginx -g 'daemon of…"   9 minutes ago       Up 9 minutes        0.0.0.0:80->80/tcp   sleepy_gould

[root@localhost html]# docker inspect -f '{{.Id}}' 0d4173ecf31f
0d4173ecf31f894e234ae9eb3d9eddd1b9d10b7af5c46608679fe11918af9644

然後將檔案拷貝進入docker容器中:

[root@localhost html]# docker cp /opt/html/user_login.html 0d4173ecf31f894e234ae9eb3d9eddd1b9d10b7af5c46608679fe11918af9644:/root/user_login.html
[root@localhost html]#

接下來的操作就比較簡單了,檢視到移動的頁面即可:

root@0d4173ecf31f:/usr/share/nginx/html# ls
50x.html  index.html  user_login.html
root@0d4173ecf31f:/usr/share/nginx/html#

接下來的基本都是常規操作了,進入我們的nginx配置中:

root@0d4173ecf31f:/etc/nginx# vi nginx.conf 
bash: vi: command not found
root@0d4173ecf31f:/etc/nginx#

發現沒有vi命令,需要下載安裝

在使用docker容器時,有時候裡邊沒有安裝vi,敲vi命令時提示說:vi: command not found,這個時候就需要安裝vi,可是當你敲apt-get install vi命令時,提示:

Reading package lists... Done  
Building dependency tree         
Reading state information... Done  
E: Unable to locate package vi

這時候需要敲:apt-get update,這個命令的作用是:同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,這樣才能獲取到最新的軟體包。等更新完畢以後再敲命令:apt-get install vi命令即可。

現在docker有了,nginx映象也開啟了,就可以對nginx的配置做修改了。

docker裡面安裝redis

首先還是老規矩,pull映象

[root@izwz9ic9ggky8kub9x1ptuz docker]# docker pull redis:4.0

拉取映象結束之後,內容如下:

[root@izwz9ic9ggky8kub9x1ptuz docker]# docker pull redis:4.0
4.0: Pulling from library/redis
b8f262c62ec6: Pull complete 
93789b5343a5: Pull complete 
49cdbb315637: Pull complete 
e244975d5eb1: Pull complete 
25dca704d939: Pull complete 
db11ecc9cf34: Pull complete 
Digest: sha256:615b872e3af387206b62ffe66c1052f1653ed31b3afcfaa292a9244c92f2007a
Status: Downloaded newer image for redis:4.0
docker.io/library/redis:4.0

ok,基本映象有了,那麼就直接開啟容器吧

這裡我們修改了宿主機的埠號為8879對映容器裡面的6379哈。

[root@izwz9ic9ggky8kub9x1ptuz /]# 
docker run -p 8879:6379 
 -v $PWD/data:/data  
 -v $PWD/conf/redis.conf:/etc/redis/redis.conf  
 --privileged=true
 --name myredis 
 -d redis:4.0 redis-server /etc/redis/redis.conf

引數解釋

  • -p 8879:8879: 將容器的8879埠對映到主機的6379埠
  • -v $PWD/data:/data : 將主機中當前目錄下的data掛載到容器的/data
  • redis-server —appendonly yes : 在容器執行redis-server啟動命令,並開啟redis持久化配置

啟動完畢之後,一切都開始正常執行了。

進入容器,開始檢測redis是否正常:

這裡建議開啟redis的時候最好在宿主機做一份redis配置檔案,對映到容器裡面,不然進入容器中根本找不到相應的redis配置檔案,很痛苦。

docker裡面安裝MySQL

這部分的內容比較簡單,只需要將映象拉下來即可:

docker run --name 【容器名】 -e MYSQL_ROOT_PASSWORD=【mysql密碼】 -d -i -p 3309:3306 mysql:5.7.24

然後等待一段時間,終於我們的MySQL容器安裝好了:

Docker 從入門到掉坑


容器的記憶體資源消耗情況
由於我購買的是一臺小型的伺服器,相關的配置如下所示,所以在給各個執行的容器進行資源分配的時候需要考慮到每個docker容器佔用的資源情況。

 

Docker 從入門到掉坑

目前已經搭建了mysql容器,redis容器,還有一個nginx容器,如果再新增一個java應用的話,目測跑java容器需要至少500m左右的記憶體大小來支撐。

通過使用docker stats命令來看當前伺服器的記憶體,由於平日的訪問量並不高,可以給當前的mysql,redis分配小一些記憶體資源:

Docker 從入門到掉坑

這時候可以採用docker的update命令來對記憶體大小進行管理分配:

docker update -m 350m  --memory-swap -1  mysqlserver

--memory-swap -1 引數是指不讓容器和宿主機進行記憶體交換,如果需要則需要額外調整,
設定下記憶體的限制之後結果如下:

Docker 從入門到掉坑

docker容器啟動失敗分析實戰

在配置docker新容器的時候,例如說給mysql配置my.cnf檔案的某些屬性,需要重啟容器才能生效。但是有時候可能因為手誤,導致配置出現異常,容器重啟失敗,這個時候該怎麼辦呢?

這個時候最簡單粗暴的方式就是,將該容器先rm掉,然後重新安裝,但是這樣的操作過於暴力化,萬一容器裡面還有其他重要資料,直接rm操作不可取。

其實docker本質也是安裝在宿主機裡面的,所以相應的配置檔案在宿主機裡面也能找到痕跡,這裡記錄了之前我掉坑的一些補救方式:

docker inspect [容器名稱]

通過該命令可以檢視到容器的內部配置屬性資訊:

Docker 從入門到掉坑


這時候我們可以檢視到一個叫做MergedDir的目錄資料夾,進入該資料夾的上一級目錄,

 

 cd /var/lib/docker/overlay2/f4ab9eff7a18f20f977595af38f5eb273127e0de8845a42fe71fa9b8850a988b

接著我們檢視該目錄下結構,會發現一個叫做diff的資料夾

Docker 從入門到掉坑


帶著好奇心,一步一步地進入到資料夾的內部,就會找到之前在docker容器中配置的mysql檔案了,手動將原先的配置修改回來,容器便重啟成功了。

Docker 從入門到掉坑

1. SpringBoot內容聚合

2. 面試題內容聚合

3. 設計模式內容聚合

4. Mybatis內容聚合

5. 多執行緒內容聚合

最後,推薦一個專注於Java學習的公眾號,Java知音。分享java基礎、原理性知識、JavaWeb實戰、spring全家桶、設計模式及面試資料、開源專案,助力開發者成長!

Javaç¥é³å®æ¹å¬ä¼å·

相關文章