Linux

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > Linux > Linux Docker的环境配置与使用

Linux Docker的环境配置与简单使用详解

作者:fengyehongWorld

本文详细介绍了如何在Windows系统上配置WSL、Docker Desktop以及VSCode插件,并通过示例项目展示了如何使用Dockerfile打包镜像、运行容器、停止和删除容器、查看容器日志和复制文件等常用Docker命令,同时,还介绍了如何使用docker-compose简化多容器应用的配置和管理

一. 环境配置

1.1 安装WSL

详情请参考下面这篇博客

Linux Windows之wsl安装使用简介

1.2 安装配置 Docker Desktop

从官网下载安装Docker Desktop

安装完成之后,进行如下配置

当我们的wsl和docker都配置完成之后,使用下面的命令应该能看到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扩展

Dev Containers扩展

1.4 下载项目,配置Dockerfile

执行下面的git命令,下载示例项目

git clone https://github.com/mattwojo/helloworld-django.git

⏹下载完成之后,移动到示例项目的根目录,应该会看到这样的目录

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命令简介

⏹所有的命令都可以通过docker --help查看

2.1 Dockerfile打包镜像

在项目的根目录下手动创建一个Dockerfile文件,创建之后的目录如下

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环境, 指定基础镜像
FROM python:3.11-slim
# 创建一个名为 app 的工作目录
WORKDIR /app
# 将当前目录下的 requirements.txt 复制到app工作目录中
COPY requirements.txt .

# 运行pip命令, 安装python项目所需的依赖
RUN pip install --no-cache-dir -r requirements.txt
# 将当前目录下的所有内容都复制到app工作目录中
COPY . /app

# 指定8000端口
EXPOSE 8000
# 启动python项目
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
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创建并启动容器

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.

容器启动之后,在浏览器中就可以看到如下所示的界面

2.3.2docker container ls --all查看所有容器

docker ps 的作用和docker container相同,只不过从语义化上看来,docker container更好。

2.3.3 容器的停止

2.3.3.1docker stop

docker stop 容器ID:停止正在运行的容器。注意:停止运行的容器并不会被删除。

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

如果你不只是要停止容器,还想连容器一起删除(比如临时容器),可以用docker rm -f-f 相当于先 stoprm

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

语义化更好

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进入容器内部

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启动一个既存的容器

docker run的方式会创建并启动一个容器,同样的命令运行两次,就会生成两个一模一样的容器文件。

如果希望重复使用容器,就要使用docker container start命令,它用来启动已经生成、已经停止运行的容器文件。

2.3.7docker container logs查看 docker 容器的输出

docker 容器的输出,即容器里面 Shell 的标准输出。如果

就要用这个命令查看输出。

2.3.8docker container cp复制容器内的文件到本地

将容器内的requirements.txt文件复制到本地的指定路径中

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仓库

Docker Registry 是 Docker 提供的镜像仓库服务,用于 存储、分发和管理 Docker 镜像。可使用 Docker Registry 来

Docker Registry 常与 docker login, docker push, docker pull 命令配合使用。

2.4.1docker pull镜像拉取

⏹镜像拉取语法:docker pull <registry>/<仓库>:<标签>

# 从docker的官网仓库拉取nginx镜像
docker pull nginx:latest
# 从私人仓库拉取镜像
docker pull myregistry.com:5000/myimage:latest

2.4.2docker push镜像推送

在推送镜像之前,你需要为镜像添加仓库地址和标签。

# docker tag <本地镜像ID或名称> <registry>/<镜像名称>:<标签>
docker tag myapp:latest myregistry.com:5000/myapp:latest

向指定的仓库推送镜像

# docker push <registry>/<镜像名称>:<标签>
docker push myregistry.com:5000/myapp:latest

三. docker-compose

3.1 遇到的问题

当我们直接使用docker run -it --rm -p 8100:8000 helloworld-django:latest命令创建并运行容器的时候,django工程会出现下面的提示,原因就在于我们在并没有进行数据迁移。

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.

我们可以通过下面的方式进行数据迁移

docker run -it \
-v $(pwd)/db.sqlite3:/app/db.sqlite3 \
-w /app \
helloworld-django \
python manage.py migrate

注意,在此案例中数据迁移之后的有数据的db.sqlite3文件并不在容器中,而是在本地的路径下。

因此,之后真正启动容器的时候,必须要将本地目录下的db.sqlite3文件挂载到容器中才行,也就是说容器中的程序读取的是本地目录中的db.sqlite3文件

使用挂载的数据的同时,启动容器

docker run -it -p 8100:8000 \
-v $(pwd)/db.sqlite3:/app/db.sqlite3 \
-w /app \
helloworld-django

但是输入这么长的命令,不仅繁琐,还很容器出错,有没有什么更好的办法?

3.2docker-compose.yml配置文件

将命令行中的配置命令,通过yml文件的方式简化到配置文件中

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构建镜像

3.4 数据迁移

docker-compose run web python manage.py migrate

需要注意的是,这种 docker-compose run 会启动一个一次性容器,它不会被 docker-compose up 管理到。

3.5docker-compose up运行容器

# --remove-orphans 在启动的时候,删除被遗漏的容器
docker-compose up --remove-orphans
# 在后台启动容器
docker-compose up -d

如下图所示,容器启动成功,页面也能正常访问。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文