一、Docker简介

docker的本意是码头工人。

图1 —— Men of the Docks(乔治·贝洛斯)

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。[1]

一、参考文章或视频链接
[1] 《Docker》- 百度百科
[2] Docker - 官方
[3] 《Men of the Docks》- Wikipedia

二、安装

2.1 Ubuntu联网安装

#  Ubuntu(24.04 LTS) 下找到 /etc/apt/sources.list.d/文件夹,添加一份docker.sources文件
Types: deb
Architectures: amd64
URIs: https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu
Suites: noble
Components: stable
Signed-By: /usr/share/keyrings/docker-archive-keyring.gpg
# 保存后终端执行下列命令
sudo install -m 0755 -d /usr/share/keyrings
curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 正式安装,见参考文章[9]
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin

这里要说明下docker composedocker-compose的区别,名字上只有一个空格和分隔符的区别,目前docker compose一般可直接替代docker-compose

参考文章或视频链接
[1] Migrate from Docker Compose v1 to v2 - 官方

2.2 离线安装

Q1:Docker Desktop与Docker Engine的区别?
Docker Engine is the fundamental containerization engine that runs on servers and manages containers, while Docker Desktop is a developer-focused tool that includes Docker Engine along with additional features to simplify the development and testing of containerized applications on local machines.[2]
简而言之,Docker Desktop > Docker Engine,Docker Engine只是一个核心组件,类似JDK与JRE的关系,在参考文章[3]里也阐明了这两者的关系与切换方式,为了完整的学习Docker,故安装Docker Desktop,我是Ubuntu系统,你可以根据参考文章[1]自行查找Windows的安装方式,其实也非常简单,一键式傻瓜安装。

# 切换至docker-engine
docker context use default
# 切换至docker-desktop
docker context use desktop-linux

如果离线安装,安装Docker Desktop前,需先把缺失的依赖装上,见参考文章[7]。
在这里插入图片描述

依赖安装好后,回到参考文章[3],安装docker-desktop

sudo apt-get update
sudo apt-get install ./docker-desktop-<version>-<arch>.deb

安装好后应该是这个样子的
在这里插入图片描述

二、参考文章或视频链接
[1] Docker Manuals - 官方
[2] What Docker Desktop and Docker Engine in Linux?
[3] Install Docker Desktop on Linux - 官方
[4] 重点参考:Install Docker Desktop on Ubuntu - 官方
[5] Dpkg Vs Apt [What’s the Difference Between Package Managers] - LinuxSimply
[6] Ubuntu使用记录:安装deb软件方法以及apt、apt-get和dpkg的区别 - CSDN
[7] 重点参考:Install Docker Engine on Ubuntu - 官方
[8] Install Docker Engine on Ubuntu - 官方
[9] Docker Engine 23.0 release notes - 官方
[10] Ubuntu Docker 安装 - 菜鸟教程

2.3 配置国内源镜像

没有daemon.json就自己建一个,记得定时清理docker产生的日志文件。
推荐使用 毫秒镜像

2.1 参考文章或视频链接
[1] docker配置国内源
[2] docker 没有 daemon.json
[3] daemon.json各配置项的含义
[4] daemon.json.md - github
[5] docker日志清理方式

三、使用

在安装好上面的Docker Desktop后,并选择好你要用default还是desktop-linux,执行以下的命令,这代表你已经安装好并可以使用docker了,Congratulations!🎉🎉🎉。

$ sudo docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.
...
三、参考文章或视频链接
[1] Emoji Cheat Sheet

四、制作Docker镜像

4.1 image镜像与container容器

就类似于操作系统镜像和虚拟机实例,没别的。

4.2 如何打包docker镜像

4.2 参考文章或视频链接
[1] docker如何打包镜像文件

4.3 导出到本地

之所以要导出到本地,是因为这样你可以将image携带到客户现场进行部署,要将Docker镜像或容器导出为本地的.tar文件,可以使用docker save命令,如果想要导出特定的镜像,可以运行以下命令(其中是要导出的镜像名称):

docker save -o <output_file>.tar <image_name>

这会将指定的镜像保存为一个.tar文件并输出到当前目录。

如果想要导出正在运行的容器,需要先获取该容器的ID或名称,然后运行以下命令(其中<container_id/name>是要导出的容器的ID或名称):

docker export -o <output_file>.tar <container_id/name>

同样,这也会将指定的容器保存为一个.tar文件并输出到当前目录。

五、Docker实战

5.1 运行docker版hello world

我们可以从将一个helloworld项目docker化入手,请看参考文章[2]

# Docker镜像打包
# 如果你使用 --rm 选项,它将删除这些中间容器,从而减少临时文件的数量。
docker build --rm -t helloworld .
# Docker镜像清理:清理在打包过程中产生的,且未使用的中间层镜像
docker image prune
# 清理容器
# 容器在启动并停止以后,并不会被自动清除,而是以exited状态继续留存在docker中,以下命令可以清除退出状态的容器
docker container prune

# 查看镜像
docker images
# 查看容器
docker ps(仅运行的)或 docker ps -a(所有)
# 删除镜像
docker rmi <IMAGE_ID_OR_NAME>
# 删除容器
docker rm <CONTAINER_ID_OR_NAME>
# docker会给运行的docker容器取一个随机的科学家名字,挺浪漫的
(base) PS E:\Projects\IdeaProjects\_PR\dockerdemo> docker ps -a
CONTAINER ID   IMAGE        COMMAND             CREATED              STATUS                          PORTS     NAMES
d6fd14c68ecb   helloworld   "java HelloWorld"   48 seconds ago       Exited (1) 45 seconds ago                 elegant_neumann(优雅的诺伊曼,这个不用说了)
3b6ef0fdc5d8   helloworld   "java HelloWorld"   About a minute ago   Exited (1) About a minute ago             keen_wiles(敏锐的怀尔斯,费马大定理那位)

# 你也可以自己指定名字
docker run --name my_custom_name -p 8001:8001 -d helloworld

如果你的HelloWorld有package,我的package是dev.polaris,请修改为以下写法

# Use a specific version of OpenJDK, This command is use to specify the version of the language which help to run the application.
FROM openjdk:11

# Set the working directory, This command is use to specify a directory where the all process will happen.
WORKDIR /javaapp

# Copy only the necessary source files, This is use to copy the files and resources from your local system to docker container.
COPY /src/main/java/dev/polaris/ /javaapp/dev/polaris/

# Compile the Java program
RUN javac ./dev/polaris/HelloWorld.java

# Set the default command to run the Java program
CMD ["java", "-cp", "/javaapp", "dev.polaris.HelloWorld"]
五、参考文章或视频链接
[1] java-docker-build-tutorial
[2] Build And Deploy Java Application With Docker | Step-By-Step Tutorial

5.2 停止所有docker容器

# 优雅地停止容器的命令
$ docker stop $(docker ps -q)
# 确认是否停止
$ docker ps -a

5.3 迁移docker数据目录

首先,停止所有docker容器
其次,找一个足够大的磁盘,将原来的docker数据mv过去

mv /var/lib/docker /mnt/d6e08a22-6c58-4ea8-87f5-d9ea8fafcaa0/docker

然后,建立soft link

ln -s /mnt/d6e08a22-6c58-4ea8-87f5-d9ea8fafcaa0/docker /var/lib/docker

5.4 配置container自动重启

参考文章或视频链接
[1] 打不死的小强,让Docker的容器自动重启

六、Docker Desktop配置

如何修改docker desktop的默认文件存储位置?

在这里插入图片描述

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐