1. 程式人生 > 其它 >docker 筆記

docker 筆記

(27條訊息) docker 筆記_zhangzeshan-CSDN部落格

docker 和虛擬機器的區別和優缺點

1.docker 是在宿主機上 一起共享作業系統
虛擬機器是在作業系統上執行作業系統
2.docker 映象小 便於傳輸和儲存 後者映象龐大
3.前者無額外效能損失 後者有額外的 CPU 記憶體消耗


centos 安裝 Docker

1.安裝一些必要的系統工具
yum install -y yum-utils device-mapper-persistent-data lvm2
2.新增軟體源資訊
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.更新 yum 快取
yum makecache fast
4.安裝 Docker-ce
yum -y install docker-ce
5.啟動 Docker 後臺服務
systemctl start docker
6.測試執行 hello-world
docker run hello-world

在 ubuntu 安裝 docker

1.更換國內軟體源,推薦中國科技大學的源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
sudo apt update
2.安裝需要的包
sudo apt install apt-transport-https ca-certificates software-properties-common curl
3.新增 GPG 金鑰,並新增 Docker-ce 軟體源,這裡還是以中國科技大學的 Docker-ce 源為例
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \$(lsb_release -cs) stable"
4.新增成功後更新軟體包快取
sudo apt update
5.安裝 docker-ce
sudo apt install docker-ce
6.設定開機自啟並 啟動 docker
sudo systemctl enable docker
sudo systemctl start docker
7.測試執行
sudo docker run hello-world

出現 Hello from Docker! 表示成功


docker 的解除安裝

1.檢視所安裝的 docker 版本
yum list installed | grep docker
2.remove 掉 docker
yum -y remove docker版本
3.刪除映象和容器
rm -rf /var/lib/docker

Image 映象

映象 就相當於類
一個映象會產生多個容器 container

搜尋點贊數大於 30 的映象 OFFICIAL 為 OK 表示官方映象:
docker search -s 30 nginx
檢視持有的所有映象
docker images (-a 顯示所有屬性  -q 只顯示id)

ps:
REPOSITORY表示映象的倉庫源
TAG表示映象版本標籤
IMAGEID表示映象ID
檢視 image 的分從
docker history IMAGE ID
刪除 image
單個:docker rmi  ab8424e38efd(IMAGEID)
刪除過程中出現Error response from daemon: conflict: unable to remove repository reference
					
先檢視在使用的容器 
						
docker ps -a
					
然後根據CONTAINER ID刪除 container  
						
docker rm CONTAINER ID
					
或者強制刪除  docker rmi -f ab8424e38efd(IMAGEID)
				

多個:docker rmi  a b c
				

全部:sudo docker rmi -f $(docker images -q)
獲取 image 方法 1-------利用 docker build 建立 image
1.建立一個資料夾  進入這個資料夾 然後建立 Dockerfile(就把這個file當作一個指令碼 裡面寫入命令 執行這個檔案  裡面的命令也會去執行)
				
編寫內容 (安裝vim)
					
FROM centos
					
RUN yum -y install vim
				
儲存退出
			
2.執行Dockerfile  建立docker-image
				
docker build -t zhangzeshan(註冊的dockerid)/centos-vim-new(image名字) .(代表執行的dockerFile是基於當前目錄的)
			
3.執行之後  檢視imgae 列表
				
dockers image   就會發現新建立了上面的iamge 並且進入這個image 發現已經裝好了vim
獲取 image 方法 2------- docker pull Registry(image 名字)—類似於 git 的拉取
//拉取ubuntu 14.04  拉取私人映象也是同樣的方法
			  
docker pull ubuntu:14.04

自己建立一個 Image-----Base Image(基礎映象)

1.拉取 hello-world 映象 (該映象屬於 baseImage)
docker pull hello-world
2.模仿做一個像上述的映象 建立一個資料夾 hello-world
進入這個資料夾 建立hello.c 檔案
編寫內容
				
#include<stdio.h>
int main(){
printf("hello-world");
}
3.通過 gcc 編譯該檔案 首先要進行 yum install glibc-static gcc
gcc -static hello.c -o hello
4.執行命令 檢視是否輸出 hello-world
./hello
5.建立 Dockerfile 檔案 編寫以下內容
FROM scratch
ADD hello /
CMD ["/hello"]
6.建立 image
docker build -t zhangzeshan/hello-world .

從 Dockerfile 構建一個映象—(推薦!)

簡寫成 docker build

1.刪掉上述的 image
docker image rm d34ef706b552(IMAGE ID)
2.建立目錄用來存放 Dockerfile
mkdir docker-centos-vim
在這個資料夾下 建立Dockerfile 檔案
3.編寫內容
FROM centos
			
RUN  yum intall -y vim
4.根據 Dockerfile 建立映象
docker build -t zhangzeshan(註冊的dockerid)/centos-vim(映象名字)  .
5.檢視所有映象
會發現上面的命令 產生了一個zhangzeshan/centos-vim的映象
		
docker images
6.使用這個映象
docker run -it zhangzeshan/centos-vim 
			
執行命令 vim  發現這個映象也已經裝了vim
7.build 過程中進行除錯:
複製要除錯的步驟的 id  去執行臨時映象
			
docker run -it 臨時映象id /bin/bash

Container 容器

有映象才能建立容器

新建並啟動容器
docker run options image commond
			
	-d :後臺執行容器 並返回容器ID 也就是啟動守護式容器
		docker run -d centos 
		(docker ps -a 會發現此時容器出於退出狀態 
		所以要用以前臺程序的形式執行 -it)

	-i :互動模式執行 通常與-t結合
		如: docker run -it 6fa48e047721 (隨機分配名字)
		docker run -it --name centos20191228  centos (自定義容器名字)
		docker run -i -t -d centos 後臺執行容器 不顯示終端互動
			
	-P :隨機埠對映(大寫)
		i:hostPort:containerPort
		ip:containerPort
		hostPort:containerPort
		containerPort
		docker run -it -P tomcat  此時訪問的埠就是為指定的預設埠tomcat的8080
			
	-p :指定埠對映(小寫)
						
		docker run -it -p 外部訪問的埠:內部訪問的埠 image名字
		如:docker run -it -p 8080:8080 tomcat  這樣就啟動了tomcat服務 可以通過地址訪問
啟動容器
docker start id或者名字
進入容器並進行終端互動
docker exec -it 容器id /bin/bash
例如:sudo docker exec -it redis-web redis-cli
重啟容器
docker restart  id或者名
停止容器
docker stop id或者名字
強制停止(殺死正在執行的容器)
docker kill id或者名字
檢視容器日誌
docker logs -f -t --tail 容器id
	-t 加入時間戳  -f 不停的列印日誌  --tail 數字 顯示最後多少條
	如:docker logs  9ebaa7e6f499
檢視正在執行的容器
docker ps 
	-a 列出當前所有正在執行的容器  docker ps -a
	-l 顯示最近建立的容器(上一次)  docker ps -l
	-n 顯示最近n個建立的容器 (上n次) docker ps -n 2
	-q 只顯示容器編號  docker ps -q
檢視容器下的程序
docker top 容器id
檢視容器內部細節
docker inspect  容器id
進入容器(先進行 start)
docker exec -it 容器id  或者  docker attach  容器id  
	exec: 在容器中開啟新的終端 並且可以啟動新的程序 
		此時沒有進入容器的終端 但是卻拿到容器的一些資料
		如:docker exec -t id ls -l /tmp  不會進入容器內 但會輸出資料夾下的列表資訊
	docker exec -it 6188f267da9a /bin/bash  (會進入容器內)
	attach:直接進入容器啟動命令的終端 不會啟動新的程序
		如:docker attach 6188f267da9a
從容器內拷貝檔案到主機
在主機的終端執行  docker cp 容器id:要拷貝的地址  存放到主機的地址
	docker cp 6188f267da9a:zhangzeshan.php  /project/docker/
退出容器
1.容器停止並退出 exit
2.容器不停止並退出 ctrl + P + Q
	執行exit出現情況:There are stopped jobs
	執行kill %1  然後再次執行exit
刪除容器
單個 docker rm id
		
多個 docker rm $(docke ps -aq)
清理所有退出狀態的 container 加上 -f 為強制清理
docker rm -f $(docker ps -aq)

docker container commit -------根據容器來建立新映象

docker commit -m=“提交的描述資訊” -a=“作者” 容器 ID 要建立的目標映象名:標籤名
簡寫成 docker commit

1.進入 centos 映象 此時就會產生一個 centos 的 container
docker run -it centos
2.進入之後 給這個 image 安裝 vim
yum install -y vim
3.安裝之後退出
:wq
4.通過命令 可以看到我們剛才退出的 image 會有對應的一個退出的 container
docker container ls -a
5.把這個 container commit 成 映象
docker commit 50ae495256fb(NAMES的值) zhangzeshan(註冊的dockerid)/centos-vim(映象名字)
6.之後檢視現有的映象
docker images
會發現多了一個映象 名字是 zhangzeshan/centos-vim
7.進入這個映象
docker run -it zhangzeshan/centos-vim 
			
然後輸入vim  發現這個映象是已經安裝了vim的centos映象

容器資料卷

實現資料持久化
docker 容器產生的資料 如果不通過 commit 生成新的映象 使得資料作為映象的一部分儲存下來
那麼 當容器刪除後 資料自然也就沒有了 為了能儲存資料 在 docker 中使用卷
特點
1。資料卷可以在容器之間共享或重用資料
2。卷中的更改可以直接生效
3。卷中的更改不會包含在映象的更新中
4。生命週期一直持續到沒有容器使用它為止

容器內新增資料卷(也就是掛載)

直接命令新增(一對一)
docker run -it -v /主機的絕對路徑:/容器內的路徑  映象名字
	docker run -it -v /myDataVolume:/dataVolumeContainer centos
	此時 主機和容器都會增加新的資料夾
	此時他們之間就會同步 比如增加一個檔案 兩邊都會有

	檢視是否掛載成功
	根據當前的容器id  在主機執行命令
	docker inspect 容器id 在出現的資訊中  Binds 說明了之間已經成功掛載
					
	不論容器是否在執行 主機在掛載專案做的任何動作都會同步
			
	容器不能增刪改查檔案  
	docker run -it  -v/myDataVolume:/dataVolumeContainer:ro centos
通過 dockerFile 新增
1.建立 docker 一個資料夾  並進入
			
2.在dockerFile中使用volume指令給映象新增一個或多個數據卷
			
3.建立dockerFile
	#volume test
	FROM centos
	VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
	CMD echo "finished,-----success1"
	CMD /bin/bash
			
4.build成一個映象
				
	docker build -f dockerfile路徑 -t 映象名字 .
			
5.執行這個映象 就會發現已經成功掛載
				
	容器對應的內容 會同步在 
	主機的/var/lib/docker/volumes/下

Dockerfile

常用命令:
保留字指令必須全部大寫 後面至少跟隨一個引數 否則報錯
指令從上到下執行

表示註釋

每條指令會建立一個新的映象層 並進行提交

FROM

來自於哪個基礎映象 也就是映象基於哪個映象 也可以是自己所建立的映象名
			
FROM centos

MAINTAINER

映象維護者的姓名和郵箱地址
			
MAINTAINER The Centos Project <[email protected]>

RUN

容器構建時 需要執行的命令 
  			
RUN groupadd -r redis && useradd -r -g redis redis

EXPOSE

當前容器對外暴露的埠號
				
EXPOSE 6379

WORKDIR

指定建立容器之後 終端互動進來的預設工作目錄
				
WORKDIR /usr/mytest

ENV

構建映象過程中設定環境變數
				
ENV MY_PATH /usr/mytest
					
使用  WORKDIR $MY_PATH

ADD

將主機的檔案 拷貝到映象 並進行自動處理和解壓

COPY

將主機的檔案 拷貝到映象
					
COPY /project/docker  /usr/local/cincontainer.txt

VOLUME

資料卷  掛載

CMD

指定容器啟動時 要執行的命令
					
允許多個CMD指令 但只有最後一個生效 並且會被docker run 之後的引數替換掉
	exec格式:CMD ["可執行檔案","引數1","引數2"]
	shell格式:CMD <命令>
	CMD /bin/bash
啟動容器的時候 docker run -it centos ls -l 此時 ls -l 會覆蓋掉dockerfile的 CMD命令的內容
而 ENTRYPOINT 是  run 後面的引數 會追加到 ENTRYPOINT引數組合成新的命令 比如 ENTRYPOINT  ["curl","-s","http://ip.cn"]
	執行 docker run -it centos -i 就變成執行 curl -s -i  http://ip.cn

ENTRYPOINT

指定容器啟動時 要執行的命令
					
跟CMD相比 不會最後一個生效  會是追加引數的狀態

ONBUILD

當構建一個被繼承的dockerfile時執行命令 
				
父映象在被子繼承後夫進行的ONBUILD被觸發
						
也就是 只要被繼承了 就進行觸發這裡的命令  類似於觸發器

docker 常用安裝

安裝 mysql

1.拉取mysql  
	docker pull mysql:5.6
		
2.執行mysql	
	docker run -p 1234:3306 --name zzsmysql -v /project/docker/mysql/conf:/etc/mysql/conf.d -v /project/docker/mysql/logs:/logs -v /project/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6	

3.進入mysql容器 操作mysql

4.外部連結的話 地址就是 宿主機的ip  密碼是 剛才的密碼123456  埠是剛才的埠1234 

5.將容器內的資料庫匯出到宿主機
	docker exec 容器id sh -C 'exec mysqldump --all-databases -uroot -p "123456"' > 宿主機目錄
	docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

關於 docker 的收集就到這裡,後續還會再更新