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?images這個命令查詢出來的只是鏡像的id,但是我們無法根據鏡像id進入容器中,進入容器需要有容器的id才可以:
于是可以通過這個命令來查看容器的id:
docker?ps然后進入容器修改信息
進入容器的命令有很多種,這里推薦可以使用這種類型:
通過選擇相應的tag-id進入容器,進入到容器里面之后,會發現里面仿佛就是一個新的linux操作系統:
如何關閉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.0ok,基本鏡像有了,那么就直接開啟容器吧
這里我們修改了宿主機的端口號為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??mysqlserver--memory-swap -1?參數是指不讓容器和宿主機進行內存交換,如果需要則需要額外調整,
設置下內存的限制之后結果如下:
docker容器啟動失敗分析實戰
在配置docker新容器的時候,例如說給mysql配置my.cnf文件的某些屬性,需要重啟容器才能生效。但是有時候可能因為手誤,導致配置出現異常,容器重啟失敗,這個時候該怎么辦呢?
這個時候最簡單粗暴的方式就是,將該容器先rm掉,然后重新安裝,但是這樣的操作過于暴力化,萬一容器里面還有其他重要數據,直接rm操作不可取。
其實docker本質也是安裝在宿主機里面的,所以相應的配置文件在宿主機里面也能找到痕跡,這里記錄了之前我掉坑的一些補救方式:
docker?inspect?[容器名稱]通過該命令可以查看到容器的內部配置屬性信息:
這時候我們可以查看到一個叫做MergedDir的目錄文件夾,進入該文件夾的上一級目錄,
接著我們查看該目錄下結構,會發現一個叫做diff的文件夾
帶著好奇心,一步一步地進入到文件夾的內部,就會找到之前在docker容器中配置的mysql文件了,手動將原先的配置修改回來,容器便重啟成功了。
有道無術,術可成;有術無道,止于術
歡迎大家關注Java之道公眾號
好文章,我在看??
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的Docker 从入门到掉坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信淘宝等平台要互通!?腾讯阿里字节回应
- 下一篇: bnuoj 20950 沉重的货物