Docker 從入門到掉坑

2022-01-10 Hollis

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:

更新 yum 緩存:

sudo yum makecache fast

驗證容器

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

sudo yum -y install docker-ce

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

sudo systemctl start docker

當我們的docker鏡像下載完畢之後,默認會有個helloworld的鏡像用於測試:

測試運行 hello-world

[root@runoob ~]

由於本地沒有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 images

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

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

docker ps

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

docker exec -it 999318c7d567 /bin/bash

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

如何關閉docker容器?

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

docker kill 4591552a4185

文件拷貝

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

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

[root@localhost html]
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]
0d4173ecf31f894e234ae9eb3d9eddd1b9d10b7af5c46608679fe11918af9644

然後將文件拷貝進入docker容器中:

[root@localhost html]
[root@localhost html]

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

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

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

root@0d4173ecf31f:/etc/nginx
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]

拉取鏡像結束之後,內容如下:

[root@izwz9ic9ggky8kub9x1ptuz docker]
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容器佔用的資源情況。

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

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

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

docker update -m 350m  

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

docker容器啟動失敗分析實戰

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

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

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

docker inspect [容器名稱]

通過該命令可以查看到容器的內部配置屬性信息:


這時候我們可以查看到一個叫做MergedDir的目錄文件夾,進入該文件夾的上一級目錄,

 cd /var/lib/docker/overlay2/f4ab9eff7a18f20f977595af38f5eb273127e0de8845a42fe71fa9b8850a988b

接著我們查看該目錄下結構,會發現一個叫做diff的文件夾


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



有道無術,術可成;有術無道,止於術

歡迎大家關注Java之道公眾號


好文章,我在看❤️

相關焦點

  • Docker(一):Docker入門教程
    本文詳細解釋介紹Docker入門相關內容,後期重點關注Docker在微服務體系中的使用。在了解Docker之前我們先考慮幾個問題:1、Docker是什麼?2、為什麼要使用Docker,它有什麼優勢?帶著這些問題我們來看看下面的內容。什麼是Docker?Docker 是世界領先的軟體容器平臺。開發人員利用 Docker 可以消除協作編碼時「在我的機器上可正常工作」的問題。
  • 一篇文章搞定 Docker 入門
    倉庫類似於 Github,我們寫好的代碼會提交到 Github 上面進行保存和管理,方便在其他地方也能下載代碼。鏡像倉庫也是類似的,製作好的鏡像,就把它放到鏡像倉庫,方便其他人直接用鏡像部署。很簡單,只要我們把其埠映射出來就可以了,在我們運行資料庫時,可以這樣使用命令:docker run -d -p 3306:3306 mysql,它就表示後臺運行 MySQL 資料庫,並把其埠映射到伺服器中,然後我們開啟伺服器防火牆相對應的 3306 埠以及阿里雲安全組 3306 埠後,就可以使用公網地址和埠號連接我們 Docker 容器中的資料庫了。
  • Docker入門,看了不理解,假一賠命
    於是我在Docker中實現了「gcc+gdb+vim」環境,並push到了hub中。首先對於Docker的概念作出我的解釋,儘量通俗易懂接著針對我用Docker的目的,從最開始的軟體下載,到最後push一個自己的鏡像到hub,整個過程以白話的形式描述出來,降低入門門檻,節省你的學習時間入門Docker,你要下載什麼?註冊什麼?
  • 史上講解最好的 Docker 教程,從入門到精通
    從一個不會用docker的小白,自己一步一步的摸索,中間也踩過許多坑。但任然,堅持從哪裡跌倒就從哪裡爬起來。不求感動自己,但求人生無悔。 1.1.1 什麼是 Linux 容器1.1.2 容器不就是虛擬化嗎1.1.3 容器發展簡史1.2 什麼是 Docker?1.2.1 Docker 如何工作?1.2.2 Docker 技術是否與傳統的 Linux 容器相同?
  • Docker 極簡入門教程
    等我到了海邊,就用這個「鏡像」,複製一套房子,拎包入住。是不是很神奇?對應到我們的項目中來,房子就是項目本身,鏡像就是項目的複製,背包就是鏡像倉庫。如果要動態擴容,從倉庫中取出項目鏡像,隨便複製就可以了。Build once,Run anywhere!不用再關注版本、兼容、部署等問題,徹底解決了「上線即崩,無休止構建」的尷尬。
  • docker入門(上)
    mac上使用docker對於mac上使用docker,官方文檔在這裡:https://docs.docker.com/engine/installation/mac/要求OS X10.8及以上。下載docker toolbox安裝裝完之後,就可以看下面的基本命令了基本命令mac上docker初始化的基本命令:// 創建一個docker,這同時會在virtualbox創建一個虛擬機docker-machine create // 列舉現有的dockerdocker-machine
  • Docker教程:Docker Compose入門
    要一次獲得所有部分,請下載並將此docker-compose-example.zip(http://www.infoworld.com/cms/mediaResource/asset?id=156685)文件解壓縮到工作目錄中。 將需要安裝最新版本的Docker; 我使用了17.12.01版本,這是當時最新的穩定版本。
  • 30 分鐘快速入門 Docker 教程
    因為容器中運行的程序和計算機的作業系統之間沒有額外的中間層,沒有資源被冗餘軟體的運行或虛擬硬體的模擬而浪費掉。Docker 的優勢不僅如此,我們來比較一番。特性Docker虛擬機啟動速度秒級分鐘級交付/部署開發、測試、生產環境一致無成熟體系性能近似物理機性能損耗大體量極小(MB)較大(GB)遷移/擴展跨平臺,可複製較為複雜2.
  • Docker 極簡入門教程,傻瓜都能看懂!
    等我到了海邊,就用這個「鏡像」,複製一套房子,拎包入住。是不是很神奇?對應到我們的項目中來,房子就是項目本身,鏡像就是項目的複製,背包就是鏡像倉庫。如果要動態擴容,從倉庫中取出項目鏡像,隨便複製就可以了。Build once,Run anywhere!不用再關注版本、兼容、部署等問題,徹底解決了「上線即崩,無休止構建」的尷尬。
  • 快速入門 Docker 實戰教程 | 圖文並茂
    因為容器中運行的程序和計算機的作業系統之間沒有額外的中間層,沒有資源被冗餘軟體的運行或虛擬硬體的模擬而浪費掉。Docker 的優勢不僅如此,我們來比較一番。特性Docker虛擬機啟動速度秒級分鐘級交付/部署開發、測試、生產環境一致無成熟體系性能近似物理機性能損耗大體量極小(MB)較大(GB)遷移/擴展跨平臺,可複製較為複雜2.
  • 史上講解最好的Docker教程,從入門到精通(建議收藏的教程)
    容器提供的鏡像包含了應用的所有依賴項,因而在從開發到測試再到生產的整個過程中,它都具有可移植性和一致性。更加詳細地來說,請您假定您在開發一個應用。您使用的是一臺筆記本電腦,而且您的開發環境具有特定的配置。其他開發人員身處的環境配置可能稍有不同。您正在開發的應用依賴於您當前的配置,還要依賴於某些特定文件。與此同時,您的企業還擁有標準化的測試和生產環境,且具有自身的配置和一系列支持文件。
  • 10 分鐘帶你從入門到精通的 Docker 小白實戰教程
    - docker push pea3nut/pea3nut-info:latest文件內容非常簡單,就是使用編譯靜態產出後,打包一個鏡像並且 push 到遠程。有幾點需要詳細說一下:為了能夠讓鏡像上傳到伺服器,你需要在 hub.docker.com 中註冊一個帳號,然後替換代碼中的 pea3nut/pea3nut-info:latest 為用戶名/包名 :latest 即可。
  • 容器化技術之Docker-從入地到上天
    0x02 Docker入門2.1 Docker介紹「Docker」 是一個開源的應用容器引擎,基於 「Go 語言」開發並遵從 Apache2.0 協議開源。Docker客戶端通過「docker run」命令啟動容器,Docker Server通過「docker daemon」守護進程查看本地有沒有鏡像,如果沒有則到「docker倉」庫中通過「docker pull」
  • Ubuntu安裝Docker採坑記錄
    添加Docker的官方GPG密鑰:curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -# 4.sudo apt-get update# 安裝最新版本的Docker,特定版本請添加版本號,如docker-ce=<VERSION_STRING>sudo apt-get install docker-ce docker-ce-cli containerd.io非root用戶使用docker如果您想以非root用戶使用Docker
  • Istio入門實戰與架構原理——使用Docker Compose搭建Service Mesh
    然而,官網上非基於Kubernetes的教程仿佛不是親兒子,寫得非常隨便,不僅缺了一些內容,而且還有坑。本文希望能補實這些內容。我認為在學習Istio的過程中,相比於Kubernetes,使用Docker Compose部署更能深刻地理解Istio各個組件的用處以及他們的交互關係。在理解了這些後,可以在其他環境,甚至直接在虛擬機上部署Istio。
  • Docker 入門終極指南,這是我見過最好的教程!
    本節我們就來探索一下 Docker 的神秘世界,從零到一掌握 Docker 的基本原理與實踐操作。別再守著前端那一畝三分地,是時候該開疆擴土了。,然後發布到任何流行的 Linux 機器上,也可以實現虛擬化。
  • 使用Mesos和Marathon管理Docker集群
    具體的介紹可參考 「Apache Mesos入門」一文,這裡就不再重複介紹了。項目地址:https://github.com/mesosphereMarathon簡介Marathon按照官方的說法是個基於Mesos的私有PaaS,它實現了Mesos的Framework。
  • CCF複賽 docker踩坑記 為明年踩坑做準備
    $ sudo systemctl start docker1.5 建立 docker 用戶組這一步比較重要,否則每次操作docker的時候都需要sudo權限默認情況下,docker 命令會使用 Unix socket 與 Docker 引擎通訊。
  • Docker快速入門之原理篇
    因此容器要比傳統虛擬機更為輕便:快速交付你的應用程式:Docker允許開發者在本地包含了應用程式和服務的容器進行開發,之後可以集成到連續的一體化和部署工作流中。舉個例子,開發者們在本地編寫代碼並且使用Docker和同事分享其開發棧。當開發者們準備好了之後,他們可以將代碼和開發棧推送到測試環境中,在該環境進行一切所需要的測試。
  • Docker小白到實戰之常用命令演示,通俗易懂
    -a :列出本地所有的鏡像(含中間鏡像層,默認過濾掉中間鏡像層)。-q :只顯示鏡像ID。docker save:導出鏡像,可以離線拷貝到其他主機上使用,避免沒有網絡不能下載鏡像的場景。生成的tar文件就可以根據需要拷貝到對應設備上加載使用,不用在線拉取,因為很多場景是不允許連外網的。