課程說明
B站視頻:Docker小白快速入門+實戰(zhàn)
課程目的:幫助從未接觸過docker的同學(xué)快速入門并上手使用衔掸,在教程最后會有一個實戰(zhàn)階段。
操作系統(tǒng):Macos物理機+Centos虛擬機
編程語言:Golang為主
Github:課程文檔俺抽、源碼
DockerHub:實戰(zhàn)課的鏡像
Docker官方文檔:docs.docker.com
環(huán)境安裝
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl enable docker
sudo systemctl start docker
Docker簡介
Build, Ship and Run Any App, Anywhere(一次封裝具篇,到處運行)
核心概念
注冊服務(wù)器、鏡像倉庫凌埂、鏡像、容器
- 注冊服務(wù)器:存放鏡像倉庫
- 鏡像倉庫:存放鏡像
- 鏡像:創(chuàng)建容器的模板
- 容器:一個鏡像的運行實例诗芜,應(yīng)用程序在容器中運行
與虛擬機對比
Docker容器可以類比虛擬機瞳抓,但比虛擬機啟動更快、資源占用更少
常用命令
鏡像
- 查看鏡像列表:docker images 或者 docker image ls
- 查看鏡像明細(xì):docker inspect 鏡像id
- 拉取鏡像:docker pull hello-world伏恐,指定tag
- 鏡像提交歷史:docker history 鏡像名:tag/id
- 刪除鏡像:docker rmi 鏡像名:tag/鏡像id
- 創(chuàng)建鏡像tag:docker tag 鏡像名:tag 新鏡像名:新tag(如果鏡像的名稱和tag已經(jīng)存在孩哑,那么此命令就是新增。否則是修改)
- 鏡像導(dǎo)出:docker save 鏡像id > 1.tar 或者 docker save -o 1.tar 鏡像id(導(dǎo)出進行的詳細(xì)信息)
- 鏡像導(dǎo)入:docker load < 1.tar 或者 docker load -i 1.tar
- 在組成服務(wù)器中搜索鏡像倉庫:docker search nginx
- docker run 創(chuàng)建并啟動一個容器(后面總結(jié))
- docker create 創(chuàng)建一個容器
容器
- 查看正在運行的容器:docker ps
- 查看所有容器:docker ps -a
- 容器的啟動翠桦、暫停横蜒、恢復(fù)、停止: docker start|pause|unpause|stop 容器id
- 查看容器內(nèi)的日志:docker logs 容器id
- 刪除容器:docker rm 容器id
- 查看容器詳情:docker inspect 容器id
- 容器導(dǎo)出:docker export 1.tar 容器id(只是導(dǎo)出當(dāng)前信息)
- 容器導(dǎo)入:docker import 1.tar 鏡像名:tag(是導(dǎo)入為一個鏡像)
- 基于當(dāng)前容器創(chuàng)建一個鏡像:docker commit
數(shù)據(jù)卷
具名和匿名掛載
-- docker run -v 宿主機地址:容器地址 鏡像id
-- docker run -v 數(shù)據(jù)卷名稱:容器地址 鏡像id
數(shù)據(jù)卷容器
共享容器的數(shù)據(jù)卷
-- docker run --volume-from=容器id 鏡像id
網(wǎng)絡(luò)
-- docker run -P 宿主機隨機分配一個端口和容器內(nèi)部開放端口進行綁定
-- docker run -p 宿主機端口:容器端口
-- docker run --link 容器id
-- docker network create mynet 創(chuàng)建一個網(wǎng)絡(luò)
-- docker run --network mynet 容器id(同一個網(wǎng)絡(luò)內(nèi)的容器可以互相ping)
Dockerfile命令
- arg 定義構(gòu)建時需要的參數(shù) arg varname=default_varvalue 或者 arg varname
- from 定義鏡像時的基礎(chǔ)鏡像 from golang:1.17
- label 定義進行的標(biāo)簽 label author=pingwazi
- expose 聲明暴露的端口销凑,給dockerfile文件維護者提供信息丛晌,在容器啟動的時候使用-P命令可以可宿主機的端口進行映射 expose 8080
- env 定義環(huán)境變量,在運行的容器中會存在 env username=pingwazi
- entrypoint 容器啟動時執(zhí)行的命令斗幼,存在多個命令時只有最后一個生效 entrypoint ["echo","hello"]
- volume 指定數(shù)據(jù)卷掛載點 volume ["/root","/home"] 或者 volume /root /home
- user 指定容器啟動后使用的用戶
- workdir 設(shè)置run澎蛛、cmd、entrypoint蜕窿、copy谋逻、add命令的工作目錄
- onbuild 當(dāng)基于此鏡像構(gòu)建新的鏡像時執(zhí)行的命令 onbuild run ["echo","hello"]
- stopsignal 給送給容器退出的信號
- healthcheck 容器健康檢查,healthcheck none 禁止容器健康檢查桐经,healthcheck --interval=3 --timeout=1 --retries=1 curl --fail http://localhost:8080/ping ||exit 1
- shell 指定shell類型命令所使用的終端類型
- run 執(zhí)行命令毁兆,在進行生成過程中執(zhí)行
- cmd 執(zhí)行命令,dockerfile中只有最后一個cmd命令生效阴挣,在啟動容器時如果指定了命令气堕,dockerfile中的cmd也會失效
- add 添加文件到容器指定目錄,文件可以是宿主機上下文目錄中的、可以url的送巡、也可以使壓縮包(會自動解壓)
- copy 拷貝宿主機上下文目錄中的文件到容器中
實戰(zhàn)
- 1摹菠、寫一個非常簡單的go web程序
- 2、編寫dockerfile文件
- 3骗爆、生成鏡像并上傳到dockerhub中
- 4次氨、另外一臺機器上pull這個鏡像,并啟動
- 5摘投、瀏覽器訪問
Dockerfile文件內(nèi)容
# 構(gòu)建編譯文件
FROM golang:1.17 as builder
# 拷貝項目文件到鏡像中
COPY . /bin/app
# 設(shè)置命令工作目錄
WORKDIR /bin/app
# 執(zhí)行命令編譯項目文件
RUN go build -o /bin/app/web-app .
# 構(gòu)建運行時文件
FROM alpine:3.13
# 添加作者
LABEL author=pingwazi
# 設(shè)置工作目錄
WORKDIR /bin/app
# 從上一階段中拷貝可執(zhí)行文件
COPY --from=builder /bin/app/web-app /bin/app/web-app
# 聲明暴露的端口
EXPOSE 8080/tcp
# 調(diào)整動態(tài)鏈接地址
RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
# 啟動服務(wù)
ENTRYPOINT [ "/bin/app/web-app" ]