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
然後進入容器修改資訊
進入容器的命令有很多種,這裡推薦可以使用這種型別:
docker exec -it 999318c7d567 /bin/bash
通過選擇相應的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.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 mysqlserver
--memory-swap -1
引數是指不讓容器和宿主機進行記憶體交換,如果需要則需要額外調整,
設定下記憶體的限制之後結果如下:
docker容器啟動失敗分析實戰
在配置docker新容器的時候,例如說給mysql配置my.cnf檔案的某些屬性,需要重啟容器才能生效。但是有時候可能因為手誤,導致配置出現異常,容器重啟失敗,這個時候該怎麼辦呢?
這個時候最簡單粗暴的方式就是,將該容器先rm掉,然後重新安裝,但是這樣的操作過於暴力化,萬一容器裡面還有其他重要資料,直接rm操作不可取。
其實docker本質也是安裝在宿主機裡面的,所以相應的配置檔案在宿主機裡面也能找到痕跡,這裡記錄了之前我掉坑的一些補救方式:
docker inspect [容器名稱]
通過該命令可以檢視到容器的內部配置屬性資訊:
這時候我們可以檢視到一個叫做MergedDir的目錄資料夾,進入該資料夾的上一級目錄,
cd /var/lib/docker/overlay2/f4ab9eff7a18f20f977595af38f5eb273127e0de8845a42fe71fa9b8850a988b
接著我們檢視該目錄下結構,會發現一個叫做diff的資料夾
帶著好奇心,一步一步地進入到資料夾的內部,就會找到之前在docker容器中配置的mysql檔案了,手動將原先的配置修改回來,容器便重啟成功了。
2. 面試題內容聚合
3. 設計模式內容聚合
4. Mybatis內容聚合
5. 多執行緒內容聚合
最後,推薦一個專注於Java學習的公眾號,Java知音。分享java基礎、原理性知識、JavaWeb實戰、spring全家桶、設計模式及面試資料、開源專案,助力開發者成長!
相關文章
- 微信小程式從入坑到入門微信小程式
- 從入門到掉坑:Go 記憶體池/物件池技術介紹Go記憶體物件
- Angular 從入坑到挖坑 - Angular 使用入門Angular
- 正規表示式從入門到入坑
- Docker從入門到精通(八)——Docker ComposeDocker
- Docker從入門到實戰pdfDocker
- Docker從入門到精通(五)——DockerfileDocker
- Docker實戰-從入門到跑路Docker
- Docker從入門到動手實踐Docker
- Docker從入門到精通(一)——初識Docker
- Docker 從入門到精通(一)基本操作Docker
- Docker 從入門到實踐-1-Docker簡介Docker
- Docker從入門到精通(六)——容器通訊Docker
- springCloud+docker從入門到高階SpringGCCloudDocker
- 龍蜥開發者說:從入坑到入門 | 第 2 期
- Docker 實戰教程之從入門到提高 (五)Docker
- Docker 實戰教程之從入門到提高 (六)Docker
- Docker 實戰教程之從入門到提高 (七)Docker
- Docker 實戰教程之從入門到提高(二)Docker
- Docker 實戰教程之從入門到提高(三)Docker
- Docker 實戰教程之從入門到提高 (四)Docker
- Docker 實戰教程之從入門到提高 (八)Docker
- Docker從入門到精通(七)——容器資料共享Docker
- Docker容器從一知半解到入門Docker
- 手摸手帶你 Docker 從入門到實踐Docker
- Docker 從入門到精通(三)一 網路配置Docker
- Docker從入門到精通(四)——常用命令Docker
- Docker 實戰教程之從入門到提高(一)Docker
- Docker 從入門到精通(二) 搭建本地倉庫Docker
- Docker 從入門到實踐-3-安裝Docker
- Docker從入門到放棄(1) Docker簡介與安裝Docker
- 從入門到放棄——快應用踩坑之路
- scala 從入門到入門+
- makefile從入門到入門
- Identity Server 4 從入門到落地(十一)—— Docker部署IDEServerDocker
- Docker從入門到精通(三)——概念與執行流程Docker
- Docker 從入門到實踐-2-基本概念Docker
- Minecraft 從入門到入坑(邊玩遊戲邊學程式設計)Raft遊戲程式設計