一、初識Docker
1、 docker是一個快速交付應用、運行應用的技術,具備下列優勢:
- 可以將程序及其依賴、運行環境一起打包為一個鏡像,可以遷移到任意Linux操作系統
- 運行時利用沙箱機制形成隔離容器,各個應用互不干擾
- 啟動、移除都可以通過一行命令完成,方便快捷
2、鏡像和容器
鏡像(Image)
:Docker將應用程序及其所需的依賴、函數庫、環境、配置等文件打包在一起,稱為鏡像。
容器(Container)
:鏡像中的應用程序運行后形成的進程就是容器,只是Docker會給容器進程做隔離,對外不可見。
3、DockerHub 鏡像托管平臺
DockerHub是一個官方的Docker鏡像的托管平臺。這樣的平臺稱為Docker Registry
4、Docker架構
Docker是一個CS架構的程序,由兩部分組成:
服務端(server)
:Docker守護進程,負責處理Docker指令,管理鏡像、容器等客戶端(client)
:通過命令或RestAPI向Docker服務端發送指令。可以在本地或遠程向服務端發送指令
二、CentOS安裝Docker及啟動
1、安裝yum工具
yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken
2、如果之前安裝過舊版本的Docker,可以使用下面命令卸載:
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine \docker-ce
3、設置docker本地鏡像源
yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
4、開始安裝docker-ce
docker-ce為社區免費版本
yum install -y docker-ce
Docker應用需要用到各種端口,如果只是練習建議直接關閉防火墻!否則就去釋放對應的端口就行
5、關閉防火墻
- 關閉 systemctl stop firewalld
- 禁止開機啟動防火墻 systemctl disable firewalld
6、啟動Docker服務
- systemctl start docker # 啟動docker服務
- systemctl stop docker # 停止docker服務
- systemctl restart docker # 重啟docker服務
- systemctl enable docker #開機自啟
使用docker -v查詢docker版本,systemctl status docker查詢啟動狀態
三、鏡像基本操作及命令
1、鏡像名稱組成規則
鏡像名稱一般分兩部分組成:[repository]:[tag]。 在沒有指定tag時,默認是latest,代表最新版本的鏡像。例如mysql:5.7中 mysql是repository ,5.7則是tag
2、鏡像操作命令
常見的鏡像操作命令如圖:
2.1 查看鏡像(docker images)
例如:docker images
2.2 刪除鏡像(docker rmi)
例如:docker rmi nginx:latest
2.3 拉取鏡像(docker pull)
例如:docker pull nginx
需求:從DockerHub中拉取一個nginx鏡像并查看
1)首先去鏡像倉庫搜索nginx鏡像,建議找官方的)
2)點進去詳情,復制docker pull nginx命令
2.4 保存鏡像(docker save)
例如:docker save -o nginx.tar nginx:latest 將nginx:latest保存為nginx.tar
2.5 導入鏡像(docker load)
例如:docker load -i nginx.tar
四、容器基本操作及命令
1、容器操作命令
容器操作的命令如圖:
容器保護三個狀態:
- 運行:進程正常運行
- 暫停:進程暫停,CPU不再運行,并不釋放內存
- 停止:進程終止,回收進程占用的內存、CPU等資源
1.1 創建并運行一個容器(docker run)
例如: docker run --name mn -p 8080:80 -d nginx
命令解讀:
docker run
:創建并運行一個容器--name
: 給容器起一個名字,比如叫做mn-p
:將宿主機端口與容器端口映射,冒號左側是宿主機端口,右側是容器端口-d
:后臺運行容器nginx
:鏡像名稱,例如nginx
1.2 讓運行的容器暫停(docker pause)
例如:docker pause mn
1.3 讓容器從暫停狀態恢復運行(docker unpause)
例如:docker unpause mn
1.4 停止運行的容器(docker stop)
例如:docker stop mn
1.5 讓停止的容器再次運行(docker start)
例如:docker start mn
1.6 刪除容器(docker rm)
例如:docker rm mn,如果該容器未處于暫停的狀態下刪除,則會失敗。可使用 docker rm -f mn 強制刪除
1.7 查看運行的容器及狀態(docker ps)
僅查看運行的容器,如想查全部的容器可用 docker ps -a
1.8 進入某個容器(docker exec)
docker exec -it mn bash 命令解讀:
docker exec
:進入容器內部,執行一個命令-it
: 給當前進入的容器創建一個標準輸入、輸出終端,允許我們與容器交互mn
:要進入的容器的名稱bash
:進入容器后執行的命令,bash是一個linux終端交互命令
2、常用的容器基本創建及運行命令
Nginx
docker run --name mn -p 8081:80 -d nginx
命令解讀:
docker run
:創建并運行一個容器--name
: 給容器起一個名字,比如叫做mn-p
:將宿主機端口與容器端口映射,冒號左側是宿主機端口,右側是容器端口,也就是說用戶可以通過主機名+8081訪問到容器的nginx-d
:后臺運行容器nginx
:鏡像名稱
Redis
docker run --name mr -p 6379:6379 -d redis redis-server --appendonly yes
命令解讀:
docker run
:創建并運行一個容器--name
: 給容器起一個名字,比如叫做mr-p
:將宿主機端口與容器端口映射,冒號左側是宿主機端口,右側是容器端口,也就是說用戶可以通過主機名+6379訪問到容器的redis-d
:后臺運行容器redis
:鏡像名稱-redis-server –appendonly yes
在容器執行redis-server啟動命令,并打開redis持久化配置
五、數據卷(容器數據管理)及相關操作命令
數據卷(volume)
是一個虛擬目錄,指向宿主機文件系統中的某個目錄。之前進入nginx內部。并且因為沒有編輯器,修改文件也很麻煩。要解決這個問題,必須將數據與容器解耦,這就要用到數據卷了。一旦完成數據卷掛載,對容器的一切操作都會作用在數據卷對應的宿主機目錄了
1、數據卷操作命令
docker volume命令是數據卷操作,根據命令后跟隨的command來確定下一步的操作:
create
創建一個volumeinspect
顯示一個或多個volume的信息ls
列出所有的volumeprune
刪除未使用的volumerm
刪除一個或多個指定的volume
1.1 創建數據卷(docker volume create)
例如:docker volume create html
1.2 查看數據卷詳細信息(docker volume inspect)
例如:docker volume inspect html
1.3 列出所有的數據卷(docker volume ls)
例如:docker volume ls
1.4 刪除未使用的數據卷(docker volume prune)
例如:docker volume prune
1.5 刪除一個或多個指定的數據卷(docker volume rm)
例如:docker volume rm
2、本地目錄掛載和數據卷掛載
docker run的命令中通過 -v 參數掛載文件或目錄到容器中
2.1 數據卷掛載
需求
:創建一個nginx容器,通過掛載的方式修改容器內的html目錄內的index.html內容
①
docker run --name mn -v html:/usr/share/nginx/html -p 8000:80 -d nginx
命令解讀:
docker run
:創建并運行一個容器--name
: 給容器起一個名字,比如叫做mn-v html:/usr/share/nginx/html
:把html數據卷掛載到容器內的 /usr/share/nginx/html 這個目錄中,如果沒有html掛載卷將會自動創建-p
:將宿主機端口與容器端口映射,冒號左側是宿主機端口,右側是容器端口-d
:后臺運行容器nginx
:鏡像名稱
② 進入html數據卷所在位置,并修改HTML內容
- 查看html數據卷的位置
docker volume inspect html
- 進入該目錄
cd /var/lib/docker/volumes/html/_data
- 修改文件
vi index.html
- 瀏覽器訪問
主機:8000
2.2 本地目錄掛載
需求
:創建并運行一個MySQL容器,將宿主機目錄直接掛載到容器
①創建目錄/tmp/mysql/data
②創建目錄/tmp/mysql/conf,并且在/tmp/mysql/conf創建一個hmy.cnf文件內容為:
[mysqld] skip-name-resolve character_set_server=utf8
datadir=/var/lib/mysql server-id=1000
③
掛載/tmp/mysql/data到mysql容器內數據存儲目錄,
掛載/tmp/mysql/conf/hmy.cnf到mysql容器的配置文件,
設置MySQL密碼
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 33060:3306
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf
-v /tmp/mysql/data:/var/lib/mysql
-d mysql:5.7.25命令解讀:
docker run
:創建并運行一個容器--name
: 給容器起一個名字,比如叫做mysql-e MYSQL_ROOT_PASSWORD=123456
: 設置mysql 的root密碼為123456-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf
: 掛載/tmp/mysql/conf/hmy.cnf到mysql容器的配置文件(這里的hmy.cnf為自己需要更新mysql配置)-v /tmp/mysql/data:/var/lib/mysql
: 掛載/tmp/mysql/data數據到mysql容器-p
:將宿主機端口與容器端口映射,冒號左側是宿主機端口,右側是容器端口-d
:后臺運行容器mysql:5.7.25
:鏡像名稱
總結:
-
帶數據卷模式
:宿主機目錄 --> 數據卷 —> 容器內目錄
由docker來管理目錄,但是目錄較深,不好找 -
直接目錄掛載模式
:宿主機目錄 —> 容器內目錄
耦合度高,需要我們自己管理目錄,不過目錄容易尋找查看 -
努力學習,持續補充更新中,多多指教~~