三.鏡像。容器相關操作以及Docker應用部署和遷移備份


一.鏡像相關

# 鏡像當成是一個沒有啟動的操作系統
# redis鏡像,mysql鏡像,nginx鏡像,django鏡像,python鏡像,指的是:linux+xx軟件----》鏡像跑起來就是--》容器:操作系統上運行着redis服務

# 查找鏡像:
  # 命令行:
docker search helloworld
docker search centos
  #官方搜索:https://hub.docker.com/
  # 如下圖

# 獲取鏡像:

docker pull centos     # 拉取最新的:相當於docker pull centos:latest  
docker pull centos:centos7  # 拉取一個centos7
docker pull centos:centos6.7
docker pull centos:centos10 # 這個 沒有,就報錯
 
# 查看本地鏡像
docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              470671670cac        3 months ago        237MB
centos              centos7             5e35e350aded        5 months ago        203MB

# 刪除本地鏡像
docker rmi 470671670cac  # 通過id號刪除
docker rmi centos:centos7 # 通過名字刪除
 
 
# docker rmi `docker images -q`
docker images -q相當於獲取所有的id號
docker rim  470671670cac 5e35e350aded

命令行查找鏡像

 

 官方搜索

 

 詳細信息

 

 

 

二.Docker容器操作

docker ps   # 查看正在運行的容器#########
docker ps –a  # 查看所有容器(暫停的,停止,正在運行的。。。)##########

docker ps –l # 查看最后一次運行的容器
docker ps -f status=exited  # 查看停止的容器

# 重點:通過鏡像創建並運行容器(兩步並做一步)
創建容器命令:docker run
-i:表示運行容器
-t:表示容器啟動后會進入其命令行。加入這兩個參數后,容器創建就能登錄進去。即分配一個偽終端。
--name :為創建的容器命名。容器名字不能重
-v:表示目錄映射關系(前者是宿主機目錄,后者是容器的目錄),可以使用多個-v做多個目錄或文件映射。注意:最好做目錄映射,在宿主機上做修改,然后共享到容器上。
-d:在run后面加上-d參數,則會創建一個守護式容器在后台運行(這樣創建容器后不會自動登錄容器,只是操作宿主機,如果只加-i -t兩個參數,創建后就會自動進去容器)。
-p:表示端口映射,前者是宿主機端口,后者是容器內的映射端口。可以使用多個-p做多個端口映射

# -v:數據卷,做目錄映射
# -p 網絡,做端口映射
#舉例:在宿主機內部跑django的容器如何鏈接跑mysql的容器
#1.容器也是有ip地址的,django可以直接鏈接
#2.將mysql的端口映射到宿主機中,比如還是映射3306,django通過訪問宿主機來訪問,但是注意修改端口號,否則宿主機和容器只能起一個,同一個端口只能被一個軟件監聽

# 演示
#基於哪個鏡像跑容器:centos:centos7   如果寫成centos表示跑最新的
#如果沒有這個鏡像呢?去遠程拉,拉下來再跑
# 容器要運行,需要有一個前台進程,可以通過守護進程的方式運行容器(解釋:下面這個容器的運行,是有一個bash終端掛在這,表示容器有一個進程在存活,bash關閉,容器也就關閉了,因此容器要運行,需要有一個前台進程)
docker run -it --name=mycentos7 centos:centos7 /bin/bash

# it表示運行並進入容器,-i -t縮寫
#--name:起一個名字
#centos:centos7:表示基於centos的centos7版本,若不加centos7表示基於最新版
# bin/bash:表示bin路徑下的base文件,他是一個軟件,是進入啟動容器的bash終端,可以有多個終端,用來執行命令的,可以通過執行exit逐層退出bash,最后一層bash退出就會退出docker

'''
[root@localhost ~]# docker run -it --name=mycentos7 centos:centos7 /bin/bash
[root@29b72b8c9766 /]# docker -v   // 這就進入容器了,這是一個純凈的centos7的容器
bash: docker: command not found
[root@29b72b8c9766 /]# exit // 退出
exit

'''


# 以守護進程形式跑(會有一個/bin/bash前台進程命令在執行,只是並沒有進入到容器內部)
docker run -di  --name=mycentos2_2 centos:centos7
 
# 進入到容器內部操作容器
1 exec(用的最多):在docker中執行命令
docker exec -it mycentos2_2 /bin/bash
exit 退出(此時退出還有一個前台進程在存活)

docker exec mycentos2_2 ls  (表示進入並執行ls命令)

2 attach (當沒有)
3 ssh連接(容器要啟動ssh服務22端口沒有服務在監聽)


# 容器的啟動與停止
docker stop 容器id/名字
docker start 容器id/名字
docker restart 容器id/名字

# 文件拷貝
# 從宿主機copy到容器內部
docker cp 要拷貝的文件或者目錄 容器名稱:容器目錄
docker cp untitled3.tar mycentos2_2:/home
# 從容器內部copy出來 (./表示當前目錄下)
docker cp mycentos2_2:/home/untitled3.tar ./

 
# 數據卷(目錄映射)
# 1.比如容器的軟件是mysql,有一個root/data目錄,里面放着數據信息,同步映射到宿主機的一個home/data目錄,這樣不論在容器中還是宿主機中增刪改查data的信息都會影響到另一個,但是如過整個容器突然沒了,宿主機還在,可以重新建一個容器重新掛上root/data,就可以恢復宿主機的信息到容器中,類似於文件共享。這就是數據卷

# 2.比如容器中跑的django,也可以做映射到外部宿主機上,這樣在宿主機中裝git,拉去最新的代碼,只要重啟一下容器,django就能跑最新的代碼了,可以實現快速更新

docker run -di  --name=mycentos2_3 -v /root/test:/home centos:centos7
# 以后操作宿主機目錄和操作容器目錄會相互影響(在-v后面添加宿主機和容器的映射目錄)

# 查看容器信息
docker inspect 容器名字/容器id
# 查看ip地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器id/名字

#主機內部的容器會公用一個虛擬的網關,宿主機本身也有一個,並且和容器共享另外這個虛擬的ip,這就是一個小的局域網,因此容器間可以通信方便

# 刪除容器
# 停止才能刪
docker rm 容器名字/id

# 刪除鏡像,如果有容器,能刪除嗎?支持,可以強制刪,但是不推薦
docker rmi -f centos:centos7


自動化運維腳本:人輸命令,shell腳本,python:subprocess執行命令
自動化運維平台:web框架,在網頁上點點點,就可以完成一些事(寶塔:python2.7+flask做的)
正在運行的容器,啟動


# 總結:
docker run  -di/-it --name=名字  -v 目錄映射,可以有多個  images:tag
docker exec -it 名字 /bin/bash
docker cp
docker stop/start/restart 容器名字
docker rm 容器名字
docker inspect 容器名字

容器與容器直接可以是相互隔離的,每個容器里面裝地方軟件可以不一樣,相互也可以不影響

容器映射一個端口,外部訪問宿主機的時候可以轉到容器中訪問容器中的軟件

容器不可以直接拿到另外一個宿主機上執行,但是可以備份轉成鏡像,鏡像就包含了原來容器中的環境,就可以放在另一個裝有docker的宿主機上,實現快速集群化部署,避免了環境的不一致等影響(補充:go更香一點,直接放可執行文件,但是也要考慮下redis等)

可以將mysql,nigx,redis等等分別裝在不同的容器中,做好容器間的通信,有利於后面的項目完善

 

 

三.Docker應用部署

# mysql服務 在docker中運行 -e表示環境變量,root密碼,這個環境變量不加就會報錯,一啟動容器就停止
docker run -id --name=mysql1 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# redis服務 在docker中運行
docker run -id --name=myredis -p 6379:6379 redis

# docker中部署django項目 nginx + django +uwsgi

映射成功后,通過虛擬機的ip和宿主機的33306端口,賬號為root,密碼為123456,就能鏈接到容器中的mysql數據庫了,也可以進入容器直接操作數據庫

 

 

四.遷移備份

# 把容器打包成鏡像
docker run -di --name=mydjango python:3.6
 
# 安裝django環境
pip install django==1.11.9
apt-get update
apt-get install vim

# 把容器打包成鏡像
docker commit 容器名字 鏡像名字
docker commit mydjango mydjango_i

# 基於鏡像再跑起容器
docker run -di --name=mydjango2 mydjango_i

# 把本地的鏡像拷貝到其他機器上去,在跑起容器來
# 打成一個tar包,壓縮一下(在當前目有個mydjango.tar)
docker  save -o mydjango.tar mydjango_i

# copy這個壓縮包到任意的機器上(裝了docker)
根據壓縮包,恢復成鏡像
docker load -i mydjango.tar

容器里裝了python3.6 mysql,django, uwsgi ,redis 項目在里面---》鏡像--》容器


 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM