Linux?Docker的環(huán)境配置與簡(jiǎn)單使用詳解
一. 環(huán)境配置
1.1 安裝WSL
詳情請(qǐng)參考下面這篇博客
1.2 安裝配置 Docker Desktop
從官網(wǎng)下載安裝Docker Desktop
- 因?yàn)?code>Docker Desktop依賴于wsl,所以需要先安裝wsl
- https://www.docker.com/products/docker-desktop/
安裝完成之后,進(jìn)行如下配置
- 指定Docker鏡像的磁盤存儲(chǔ)位置
- 指定對(duì)應(yīng)的wsl

當(dāng)我們的wsl和docker都配置完成之后,使用下面的命令應(yīng)該能看到docker的版本和wsl的掛載目錄
apluser@FengYeHong-HP:~$ docker --version Docker version 28.1.1, build 4eba377 apluser@FengYeHong-HP:~$ apluser@FengYeHong-HP:~$ ls -l /mnt/wsl/ drwxr-xr-x 4 root root 100 Jun 11 20:06 docker-desktop drwxr-xr-x 3 root root 60 Jun 11 20:06 docker-desktop-bind-mounts -rw-r--r-- 1 root root 198 Jun 11 20:06 resolv.conf
1.3 VS Code 插件安裝
Docker擴(kuò)展
- 提供對(duì)Dockerfile的語(yǔ)法檢測(cè),代碼高亮,自動(dòng)補(bǔ)全
- 可以通過菜單運(yùn)行各種Docker命令
- 可以在左側(cè)面板中看到我們創(chuàng)建的所有鏡像,容器等

Dev Containers擴(kuò)展
- 支持在容器中打開代碼項(xiàng)目
- 自動(dòng)配置開發(fā)環(huán)境,通過
.devcontainer目錄定義語(yǔ)言版本、依賴、插件等 - 調(diào)試支持,支持容器內(nèi)調(diào)試(Node.js、Python、C++ 等)

1.4 下載項(xiàng)目,配置Dockerfile
執(zhí)行下面的git命令,下載示例項(xiàng)目
git clone https://github.com/mattwojo/helloworld-django.git
?下載完成之后,移動(dòng)到示例項(xiàng)目的根目錄,應(yīng)該會(huì)看到這樣的目錄
apluser@FengYeHong-HP:helloworld-django$ ls -l total 148 -rw-r--r-- 1 apluser apluser 483 Jun 11 20:48 Dockerfile -rw-r--r-- 1 apluser apluser 131072 Jun 7 16:56 db.sqlite3 drwxr-xr-x 4 apluser apluser 4096 Jun 7 09:38 hello -rwxr-xr-x 1 apluser apluser 667 Jun 7 09:38 manage.py -rw-r--r-- 1 apluser apluser 16 Jun 7 09:38 requirements.txt drwxr-xr-x 3 apluser apluser 4096 Jun 7 09:38 web_project
二. 常用Docker命令簡(jiǎn)介
?所有的命令都可以通過docker --help查看
2.1 Dockerfile打包鏡像
在項(xiàng)目的根目錄下手動(dòng)創(chuàng)建一個(gè)Dockerfile文件,創(chuàng)建之后的目錄如下
apluser@FengYeHong-HP:helloworld-django$ ls -l total 148 -rw-r--r-- 1 apluser apluser 196 Jun 7 16:54 Dockerfile -rw-r--r-- 1 apluser apluser 131072 Jun 7 16:56 db.sqlite3 drwxr-xr-x 4 apluser apluser 4096 Jun 7 09:38 hello -rwxr-xr-x 1 apluser apluser 667 Jun 7 09:38 manage.py -rw-r--r-- 1 apluser apluser 16 Jun 7 09:38 requirements.txt drwxr-xr-x 3 apluser apluser 4096 Jun 7 09:38 web_project apluser@FengYeHong-HP:helloworld-django$ apluser@FengYeHong-HP:helloworld-django$ cat Dockerfile # 安裝python環(huán)境, 指定基礎(chǔ)鏡像 FROM python:3.11-slim # 創(chuàng)建一個(gè)名為 app 的工作目錄 WORKDIR /app # 將當(dāng)前目錄下的 requirements.txt 復(fù)制到app工作目錄中 COPY requirements.txt . # 運(yùn)行pip命令, 安裝python項(xiàng)目所需的依賴 RUN pip install --no-cache-dir -r requirements.txt # 將當(dāng)前目錄下的所有內(nèi)容都復(fù)制到app工作目錄中 COPY . /app # 指定8000端口 EXPOSE 8000 # 啟動(dòng)python項(xiàng)目 CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
-t參數(shù)用來指定 image 文件的名字,后面還可以用冒號(hào)指定標(biāo)簽。如果不指定,默認(rèn)的標(biāo)簽就是latest。- 最后的那個(gè)
.表示Dockerfile文件所在的路徑,因?yàn)楫?dāng)前路徑在Dockerfile文件所在的目錄,所示是一個(gè).。
docker image build -t helloworld-django . # 或者 docker image build -t helloworld-django:0.0.1 .
2.2 image鏡像
2.2.1docker image ls查看所有鏡像
apluser@FengYeHong-HP:~$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE helloworld-django latest 51fedeaf85ff 2 days ago 363MB hello-world latest 0b6a027b5cf3 4 months ago 20.4kB
2.2.2docker image rm 鏡像ID刪除指定鏡像
apluser@FengYeHong-HP:~$ docker image rm 51fedeaf85ff Untagged: helloworld-django:latest Deleted: sha256:51fedeaf85ffdc569edae785cce00602eb90b4a7a12766c6f671a517f0c4f199 apluser@FengYeHong-HP:~$ apluser@FengYeHong-HP:~$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 0b6a027b5cf3 4 months ago 20.4kB
2.3 container容器
2.3.1docker run創(chuàng)建并啟動(dòng)容器
-it:容器的 Shell 映射到當(dāng)前的 Shell,然后你在本機(jī)窗口輸入的命令,就會(huì)傳入容器--rm:容器一旦停止就會(huì)自動(dòng)刪除(僅在臨時(shí)測(cè)試時(shí)使用)-p:容器的 8000 端口映射到本機(jī)的 8100 端口helloworld-django:latest:指定要啟動(dòng)的容器
apluser@FengYeHong-HP:~$ docker run -it --rm -p 8100:8000 helloworld-django:latest Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. Run 'python manage.py migrate' to apply them. June 14, 2025 - 00:12:19 Django version 3.2.25, using settings 'web_project.settings' Starting development server at http://0.0.0.0:8000/ Quit the server with CONTROL-C.
容器啟動(dòng)之后,在瀏覽器中就可以看到如下所示的界面

2.3.2docker container ls --all查看所有容器
docker container ls:查看正在運(yùn)行的容器docker container ls --all:查看正在所有容器,包括已經(jīng)停止運(yùn)行的容器

docker ps 的作用和docker container相同,只不過從語(yǔ)義化上看來,docker container更好。

2.3.3 容器的停止
2.3.3.1docker stop
docker stop 容器ID:停止正在運(yùn)行的容器。注意:停止運(yùn)行的容器并不會(huì)被刪除。
docker stop <容器ID或名稱>會(huì)向容器發(fā)送SIGTERM信號(hào),讓其優(yōu)雅退出,如果在默認(rèn)的 10 秒內(nèi)還沒退出,則發(fā)送SIGKILL強(qiáng)制終止。docker kill <容器ID或名稱>會(huì)立即強(qiáng)制終止容器(不等待)
apluser@FengYeHong-HP:~$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d32995d7a305 helloworld-django:latest "python manage.py ru…" 22 minutes ago Up 22 minutes 0.0.0.0:8100->8000/tcp kind_bassi apluser@FengYeHong-HP:~$ apluser@FengYeHong-HP:~$ docker stop d32995d7a305 d32995d7a305
2.3.3.2docker container stop
apluser@FengYeHong-HP:~$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 783e1ad29407 helloworld-django:latest "python manage.py ru…" 16 minutes ago Up 16 minutes 0.0.0.0:8100->8000/tcp reverent_lalande apluser@FengYeHong-HP:~$ apluser@FengYeHong-HP:~$ docker container stop 783e1ad29407 783e1ad29407
2.3.4 容器的刪除
2.3.4.1docker rm
如果你不只是要停止容器,還想連容器一起刪除(比如臨時(shí)容器),可以用docker rm -f, -f 相當(dāng)于先 stop 再 rm
apluser@FengYeHong-HP:~$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4c07319bbebc helloworld-django:latest "python manage.py ru…" 11 seconds ago Up 9 seconds 0.0.0.0:8100->8000/tcp infallible_sammet apluser@FengYeHong-HP:~$ apluser@FengYeHong-HP:~$ docker rm -f 4c07319bbebc 4c07319bbebc
2.3.4.2docker container rm
語(yǔ)義化更好
apluser@FengYeHong-HP:~$ docker container ls --all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6380b917ff0c helloworld-django:latest "python manage.py ru…" 44 seconds ago Up 42 seconds 0.0.0.0:8100->8000/tcp determined_boyd f0e58479ba3d helloworld-django "python manage.py ru…" 54 minutes ago Exited (0) 54 minutes ago vigorous_leavitt cca37d72e4ba helloworld-django "python manage.py ru…" 54 minutes ago Exited (0) 54 minutes ago musing_franklin f51614fe80d9 helloworld-django:latest "python manage.py ru…" 55 minutes ago Exited (0) 54 minutes ago unruffled_franklin bb11c3bbaf5f helloworld-django "python manage.py ru…" 56 minutes ago Exited (0) 56 minutes ago relaxed_banach apluser@FengYeHong-HP:~$ apluser@FengYeHong-HP:~$ docker container rm bb11c3bbaf5f bb11c3bbaf5f apluser@FengYeHong-HP:~$
2.3.5docker exec進(jìn)入容器內(nèi)部
apluser@FengYeHong-HP:~$ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 783e1ad29407 helloworld-django:latest "python manage.py ru…" 12 seconds ago Up 11 seconds 0.0.0.0:8100->8000/tcp reverent_lalande apluser@FengYeHong-HP:~$ apluser@FengYeHong-HP:~$ docker exec -it 783e1ad29407 bash root@783e1ad29407:/app# ls -l total 20 -rw-r--r-- 1 root root 483 Jun 11 11:48 Dockerfile -rw-r--r-- 1 root root 0 Jun 13 23:58 db.sqlite3 drwxr-xr-x 4 root root 4096 Jun 7 00:38 hello -rwxr-xr-x 1 root root 667 Jun 7 00:38 manage.py -rw-r--r-- 1 root root 16 Jun 7 00:38 requirements.txt drwxr-xr-x 3 root root 4096 Jun 7 00:38 web_project
2.3.6docker container start啟動(dòng)一個(gè)既存的容器
docker run的方式會(huì)創(chuàng)建并啟動(dòng)一個(gè)容器,同樣的命令運(yùn)行兩次,就會(huì)生成兩個(gè)一模一樣的容器文件。
如果希望重復(fù)使用容器,就要使用docker container start命令,它用來啟動(dòng)已經(jīng)生成、已經(jīng)停止運(yùn)行的容器文件。

2.3.7docker container logs查看 docker 容器的輸出
docker 容器的輸出,即容器里面 Shell 的標(biāo)準(zhǔn)輸出。如果
docker run命令運(yùn)行容器的時(shí)候,沒有使用-it參數(shù)docker container start直接啟動(dòng)既存容器時(shí)
就要用這個(gè)命令查看輸出。

2.3.8docker container cp復(fù)制容器內(nèi)的文件到本地
將容器內(nèi)的requirements.txt文件復(fù)制到本地的指定路徑中
apluser@FengYeHong-HP:~$ docker exec -it f0e58479ba3d bash root@f0e58479ba3d:/app# root@f0e58479ba3d:/app# ls -l total 20 -rw-r--r-- 1 root root 483 Jun 11 11:48 Dockerfile -rw-r--r-- 1 root root 0 Jun 13 23:58 db.sqlite3 drwxr-xr-x 4 root root 4096 Jun 7 00:38 hello -rwxr-xr-x 1 root root 667 Jun 7 00:38 manage.py -rw-r--r-- 1 root root 16 Jun 7 00:38 requirements.txt drwxr-xr-x 3 root root 4096 Jun 7 00:38 web_project root@f0e58479ba3d:/app# root@f0e58479ba3d:/app# exit exit apluser@FengYeHong-HP:~$ docker container cp f0e58479ba3d:/app/requirements.txt /home/apluser/work/ Successfully copied 2.05kB to /home/apluser/work/ apluser@FengYeHong-HP:~$ apluser@FengYeHong-HP:~$ ls -l /home/apluser/work/requirements.txt -rw-r--r-- 1 apluser apluser 16 Jun 7 09:38 /home/apluser/work/requirements.txt
2.4 registry倉(cāng)庫(kù)
Docker Registry 是 Docker 提供的鏡像倉(cāng)庫(kù)服務(wù),用于 存儲(chǔ)、分發(fā)和管理 Docker 鏡像。可使用 Docker Registry 來:
- 上傳(push)鏡像
- 下載(pull)鏡像
- 搭建私有鏡像倉(cāng)庫(kù)
Docker Registry 常與 docker login, docker push, docker pull 命令配合使用。
2.4.1docker pull鏡像拉取
?鏡像拉取語(yǔ)法:docker pull <registry>/<倉(cāng)庫(kù)>:<標(biāo)簽>
# 從docker的官網(wǎng)倉(cāng)庫(kù)拉取nginx鏡像 docker pull nginx:latest # 從私人倉(cāng)庫(kù)拉取鏡像 docker pull myregistry.com:5000/myimage:latest
2.4.2docker push鏡像推送
在推送鏡像之前,你需要為鏡像添加倉(cāng)庫(kù)地址和標(biāo)簽。
# docker tag <本地鏡像ID或名稱> <registry>/<鏡像名稱>:<標(biāo)簽> docker tag myapp:latest myregistry.com:5000/myapp:latest
向指定的倉(cāng)庫(kù)推送鏡像
# docker push <registry>/<鏡像名稱>:<標(biāo)簽> docker push myregistry.com:5000/myapp:latest
三. docker-compose
3.1 遇到的問題
當(dāng)我們直接使用docker run -it --rm -p 8100:8000 helloworld-django:latest命令創(chuàng)建并運(yùn)行容器的時(shí)候,django工程會(huì)出現(xiàn)下面的提示,原因就在于我們?cè)诓]有進(jìn)行數(shù)據(jù)遷移。
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. Run 'python manage.py migrate' to apply them.
我們可以通過下面的方式進(jìn)行數(shù)據(jù)遷移
docker run -it \ -v $(pwd)/db.sqlite3:/app/db.sqlite3 \ -w /app \ helloworld-django \ python manage.py migrate
注意,在此案例中數(shù)據(jù)遷移之后的有數(shù)據(jù)的db.sqlite3文件并不在容器中,而是在本地的路徑下。
因此,之后真正啟動(dòng)容器的時(shí)候,必須要將本地目錄下的db.sqlite3文件掛載到容器中才行,也就是說容器中的程序讀取的是本地目錄中的db.sqlite3文件

使用掛載的數(shù)據(jù)的同時(shí),啟動(dòng)容器
-v /主機(jī)路徑文件:/容器路徑文件這會(huì)讓容器內(nèi)部使用主機(jī)上的文件,從而讓db.sqlite3的內(nèi)容得以持久保存。-w /app設(shè)置容器內(nèi)的工作目錄是/app,這個(gè)要與你 Dockerfile 中 WORKDIR 設(shè)置一致(通常也是/app)
docker run -it -p 8100:8000 \ -v $(pwd)/db.sqlite3:/app/db.sqlite3 \ -w /app \ helloworld-django

但是輸入這么長(zhǎng)的命令,不僅繁瑣,還很容器出錯(cuò),有沒有什么更好的辦法?
3.2docker-compose.yml配置文件
將命令行中的配置命令,通過yml文件的方式簡(jiǎn)化到配置文件中
apluser@FengYeHong-HP:helloworld-django$ ls -l
total 152
-rw-r--r-- 1 apluser apluser 483 Jun 11 20:48 Dockerfile
-rw-r--r-- 1 apluser apluser 131072 Jun 14 14:49 db.sqlite3
-rw-r--r-- 1 apluser apluser 259 Jun 14 15:14 docker-compose.yml
drwxr-xr-x 4 apluser apluser 4096 Jun 7 09:38 hello
-rwxr-xr-x 1 apluser apluser 667 Jun 7 09:38 manage.py
-rw-r--r-- 1 apluser apluser 16 Jun 7 09:38 requirements.txt
drwxr-xr-x 3 apluser apluser 4096 Jun 7 09:38 web_project
apluser@FengYeHong-HP:helloworld-django$
apluser@FengYeHong-HP:helloworld-django$ cat docker-compose.yml
services:
web:
image: helloworld-django
build:
context: .
dockerfile: Dockerfile
ports:
- "8100:8000"
volumes:
- ./db.sqlite3:/app/db.sqlite3
working_dir: /app
command: python manage.py runserver 0.0.0.0:8000
3.3docker-compose build構(gòu)建鏡像

3.4 數(shù)據(jù)遷移
docker-compose run web python manage.py migrate
- 執(zhí)行命令進(jìn)行數(shù)據(jù)遷移
- 此處的
web應(yīng)當(dāng)和docker-compose.yml文件中的services對(duì)應(yīng)的名稱相同

需要注意的是,這種 docker-compose run 會(huì)啟動(dòng)一個(gè)一次性容器,它不會(huì)被 docker-compose up 管理到。

3.5docker-compose up運(yùn)行容器
# --remove-orphans 在啟動(dòng)的時(shí)候,刪除被遺漏的容器 docker-compose up --remove-orphans # 在后臺(tái)啟動(dòng)容器 docker-compose up -d
如下圖所示,容器啟動(dòng)成功,頁(yè)面也能正常訪問。

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Unix/Linux系統(tǒng)下的nobody用戶與nologin詳細(xì)介紹
linux系統(tǒng)下的nobody用戶是什么用戶,nologin又是什么?本文為大家詳細(xì)介紹了這兩個(gè)no字輩2018-10-10
Ubuntu18 給terminal改個(gè)漂亮的命令行提示符的方法
這篇文章主要介紹了Ubuntu18 給terminal改個(gè)漂亮的命令行提示符的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06
linux系統(tǒng)中設(shè)置定時(shí)任務(wù)的實(shí)現(xiàn)方式
在SpringBoot中設(shè)置定時(shí)任務(wù),需要使用@EnableScheduling注解和@Scheduled注解,配合cron表達(dá)式,在Linux系統(tǒng)中,使用crontab工具可設(shè)置系統(tǒng)級(jí)的定時(shí)任務(wù),首先需要?jiǎng)?chuàng)建執(zhí)行腳本,并賦予執(zhí)行權(quán)限,然后通過crontab?-e進(jìn)入編輯界面2024-10-10
詳解linux系統(tǒng)輸入輸出管理和vim的常用功能
這篇文章主要介紹了linux系統(tǒng)輸入輸出管理和vim的常用功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
解決Linux Centos yum-config-manager --add-repo添
這篇文章主要介紹了解決Linux Centos yum-config-manager --add-repo添加倉(cāng)庫(kù)添加錯(cuò)誤問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04

