docker 筆記
阿新 • • 發佈:2022-03-05
(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
將主機的檔案 拷貝到映象 並進行自動處理和解壓
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 的收集就到這裡,後續還會再更新