概述
Docker的三要素:镜像、容器、仓库
镜像
镜像是一个轻量级、可执行的独立软件包,其中包含了运行某个应用程序所需的所有内容:包括代码、运行时、库、环境变量和配置文件等。可以将镜像看作一个食谱,里面会有制作一道菜的所有步骤,只需要按照食谱的步骤做就可以获得相同的食物。
镜像的主要特性就是不可以修改,是只读的
容器
根据食谱做出来的菜品就类似于容器。根据食谱运行出来的实例,其执行着镜像中定义的应用,其具有可变的数据
容器是镜像的一个运行实例。容器是在镜像的基础上创建出来的,镜像是容器的“模板”。容器是运行时的实体,它会运行镜像中的应用,并且可以进行读写操作。容器是轻量级的,且启动速度非常快
容器具有独立性,每个容器都是一个独立的环境,其拥有自己的文件系统网络等。与此同时还易于管理,可以停止、删除、复制、重启容器,就像是处理制作好的菜肴。
仓库
类似于书店,专门存放食谱的地方。你可以从中挑选自己喜欢的食谱来制作菜肴。不同的书店可能有不同的食谱
仓库是存储镜像的地方,可以看作是镜像的集合。镜像仓库通常用于存储和管理多个版本的镜像。Docker 提供了一个官方的镜像仓库 Docker Hub,但你也可以设置私有仓库来存储公司或个人的镜像
所以说获取别人的镜像就类似于日常生活中去超市购物
仓库可以公开以可以内部私有;另外仓库的镜像中有多个版本,一般通过多个标签来区分不同版本的镜。例如 ubuntu:18.04
和 ubuntu:20.04
就是 Ubuntu 系统的不同版本。
简单使用
创建一个简单的C++文件
#include <iostream>
int main() {
std::cout << "Hello, Docker World!" << std::endl;
return 0;
}
创建一个Dockerfile文件
# 使用官方的 C++ 编译器镜像作为基础镜像
FROM gcc:latest
# 设置工作目录为 /app
WORKDIR /app
# 将本地的 C++ 源文件复制到容器中的 /app 目录
COPY main.cpp .
# 使用 g++ 编译程序
RUN g++ -o main main.cpp
# 设置容器启动时的默认命令
CMD ["./main"]
构建Docker镜像
docker build -t cpp-docker-example .
镜像配置,国内的一些镜像失效,将 下述配置修改到/etc/docker/daemon.json
{
"registry-mirrors": [
"https://dockerpull.org",
"https://docker.1panel.dev",
"https://docker.foreverlink.love",
"https://docker.fxxk.dedyn.io",
"https://docker.xn--6oq72ry9d5zx.cn",
"https://docker.zhai.cm",
"https://docker.5z5f.com",
"https://a.ussh.net",
"https://docker.cloudlayer.icu",
"https://hub.littlediary.cn",
"https://hub.crdz.gq",
"https://docker.unsee.tech",
"https://docker.kejilion.pro",
"https://registry.dockermirror.com",
"https://hub.rat.dev",
"https://dhub.kubesre.xyz",
"https://docker.nastool.de",
"https://docker.udayun.com",
"https://docker.rainbond.cc",
"https://hub.geekery.cn",
"https://docker.1panelproxy.com",
"https://atomhub.openatom.cn",
"https://docker.m.daocloud.io",
"https://docker.1ms.run",
"https://docker.linkedbus.com",
"https://dytt.online",
"https://func.ink",
"https://lispy.org",
"https://docker.xiaogenban1993.com"
]
}
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/hello# docker build -t cpp-docker-example .
[+] Building 895.3s (9/9) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 128B 0.0s
=> [internal] load metadata for docker.io/library/gcc:latest 494.5s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/4] FROM docker.io/library/gcc:latest@sha256:98c5c3064808cb8b01933a7e2a33f1ef7e4aedf8600a08409a01d7ecf6e02701 399.2s
=> => resolve docker.io/library/gcc:latest@sha256:98c5c3064808cb8b01933a7e2a33f1ef7e4aedf8600a08409a01d7ecf6e02701 0.0s
=> => sha256:98c5c3064808cb8b01933a7e2a33f1ef7e4aedf8600a08409a01d7ecf6e02701 7.64kB / 7.64kB 0.0s
=> => sha256:87992d0f205222132ff22f4b46f476598d7ec7ef8c3da4142cfedfb65a427b9c 7.34kB / 7.34kB 0.0s
=> => sha256:8031108f3cda87bb32f090262d0109c8a0db99168050967becefad502e9a681b 24.06MB / 24.06MB 127.0s
=> => sha256:1b0aa48d9987e7a7b56c9f64aad8318c2b211d071d49ac042e79761475f5b7b7 2.49kB / 2.49kB 0.0s
=> => sha256:155ad54a8b2812a0ec559ff82c0c6f0f0dddb337a226b11879f09e15f67b69fc 48.48MB / 48.48MB 132.4s
=> => sha256:1d281e50d3e435595c266df06531a7e8c2ebb0c185622c8ab2eed8d760e6576b 64.39MB / 64.39MB 133.0s
=> => sha256:447713e77b4fc3658cfba0c1e816b70ff6d9bf06563dc8cfcb0459406aed33b4 211.34MB / 211.34MB 278.4s
=> => extracting sha256:155ad54a8b2812a0ec559ff82c0c6f0f0dddb337a226b11879f09e15f67b69fc 2.2s
=> => sha256:3d9057a850e9f73cae5e182aa315db53bdc15665084ebde7b61a3a127016cdef 2.81MB / 2.81MB 255.4s
=> => sha256:2fe1018c3be6e1bb417346205511033cdd727303b343469c4fce54374ce0253c 157.73MB / 157.73MB 278.6s
=> => extracting sha256:8031108f3cda87bb32f090262d0109c8a0db99168050967becefad502e9a681b 0.6s
=> => extracting sha256:1d281e50d3e435595c266df06531a7e8c2ebb0c185622c8ab2eed8d760e6576b 2.7s
=> => sha256:368f565cd5914c8f318e8cfdd5790b803ae0cfd02af0b3db2f99b65b1ab16c64 9.60kB / 9.60kB 377.7s
=> => sha256:2c61c289655f74c2c19fe7bb87fcd59f6d8db62038027ecbf3d125baf17b5225 1.79kB / 1.79kB 398.9s
=> => extracting sha256:447713e77b4fc3658cfba0c1e816b70ff6d9bf06563dc8cfcb0459406aed33b4 7.0s
=> => extracting sha256:3d9057a850e9f73cae5e182aa315db53bdc15665084ebde7b61a3a127016cdef 0.1s
=> => extracting sha256:2fe1018c3be6e1bb417346205511033cdd727303b343469c4fce54374ce0253c 4.9s
=> => extracting sha256:368f565cd5914c8f318e8cfdd5790b803ae0cfd02af0b3db2f99b65b1ab16c64 0.0s
=> => extracting sha256:2c61c289655f74c2c19fe7bb87fcd59f6d8db62038027ecbf3d125baf17b5225 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 139B 0.0s
=> [2/4] WORKDIR /app 0.1s
=> [3/4] COPY main.cpp . 0.0s
=> [4/4] RUN g++ -o main main.cpp 1.3s
=> exporting to image 0.1s
=> => exporting layers 0.1s
=> => writing image sha256:7873d0526077fa40623d442ca4c3aac58ffa83b50d3abf2d4619df913a897e08 0.0s
=> => naming to docker.io/library/cpp-docker-example
运行容器
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/hello# docker run cpp-docker-example
Hello, Docker World!
打包Docker镜像为文件
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/hello# ll
total 20
drwxr-xr-x 2 root root 4096 Mar 1 13:32 ./
drwxr-xr-x 3 root root 4096 Mar 1 13:27 ../
-rw-r--r-- 1 root root 91 Mar 1 13:33 Dockerfile
-rw-r--r-- 1 root root 104 Mar 1 13:32 main.cpp
-rw-r--r-- 1 root root 12 Mar 1 13:29 requirements.txt
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/hello# docker save -o cpp-docker-example.tar cpp-docker-example
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/hello# ll
total 1410856
drwxr-xr-x 2 root root 4096 Mar 1 14:16 ./
drwxr-xr-x 3 root root 4096 Mar 1 13:27 ../
-rw------- 1 root root 1444688384 Mar 1 14:16 cpp-docker-example.tar
-rw-r--r-- 1 root root 91 Mar 1 13:33 Dockerfile
-rw-r--r-- 1 root root 104 Mar 1 13:32 main.cpp
-rw-r--r-- 1 root root 12 Mar 1 13:29 requirements.txt
加载Docker打包后的镜像然后运行
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/test# ll
total 1410844
drwxr-xr-x 2 root root 4096 Mar 1 14:19 ./
drwxr-xr-x 4 root root 4096 Mar 1 14:19 ../
-rw------- 1 root root 1444688384 Mar 1 14:16 cpp-docker-example.tar
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/test# docker load -i cpp-docker-examle.tar
open cpp-docker-examle.tar: no such file or directory
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/test# ll
total 1410844
drwxr-xr-x 2 root root 4096 Mar 1 14:19 ./
drwxr-xr-x 4 root root 4096 Mar 1 14:19 ../
-rw------- 1 root root 1444688384 Mar 1 14:16 cpp-docker-example.tar
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/test# docker load -i cpp-docker-example.tar
Loaded image: cpp-docker-example:latest
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/test# docker run cpp-docker-example
Hello, Docker World!
清理镜像
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/hello# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e70e0c643eee cpp-docker-example "./main" 9 minutes ago Exited (0) 9 minutes ago happy_fermat
6094242326bb cpp-docker-example "./main" 29 minutes ago Exited (0) 29 minutes ago vigilant_hermann
aaa771b136e9 cpp-docker-example "./main" 29 minutes ago Exited (0) 29 minutes ago brave_carver
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/hello# docker rm e70e0c643eee
e70e0c643eee
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/hello# docker rm 6094242326bb
6094242326bb
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/hello# docker rm aaa771b136e9
aaa771b136e9
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/hello# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/hello# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cpp-docker-example latest 7873d0526077 35 minutes ago 1.42GB
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/hello# docker rmi cpp-docker-example
Untagged: cpp-docker-example:latest
Deleted: sha256:7873d0526077fa40623d442ca4c3aac58ffa83b50d3abf2d4619df913a897e08
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/hello# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/hello#
常用功能补充
镜像管理
查看本地镜像
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/test# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cpp-docker-example latest 7873d0526077 26 minutes ago 1.42GB
拉取镜像
一般情况下是从远程仓库中拉取
docker pull <image_name>
删除镜像
docker rmi <image_name_or_id>
构建镜像和运行镜像
docker build -t <image_name>:<tag> <path_to_dockerfile>
docker build -t my-app .
容器管理
查看运行的容器和所有容器
// 查看正在运行的容器
docker ps
// 查看所有容器
docker ps -a
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/test# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/test# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e70e0c643eee cpp-docker-example "./main" 5 minutes ago Exited (0) 5 minutes ago happy_fermat
6094242326bb cpp-docker-example "./main" 25 minutes ago Exited (0) 25 minutes ago vigilant_hermann
aaa771b136e9 cpp-docker-example "./main" 25 minutes ago Exited (0) 25 minutes ago brave_carver
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/test#
启动和终止一个容器
// 启动一个容器
docker start <container_id_or_name>
// 终止一个容器
docker stop <container_id_or_name>
// 重启容器
docker restart <container_id_or_name>
删除容器
// 普通删除一个容器
docker rm <container_id_or_name>
// 强制删除一个容器
docker rm -f <container_id_or_name>
查看容器日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e70e0c643eee cpp-docker-example "./main" 5 minutes ago Exited (0) 5 minutes ago happy_fermat
6094242326bb cpp-docker-example "./main" 25 minutes ago Exited (0) 25 minutes ago vigilant_hermann
aaa771b136e9 cpp-docker-example "./main" 25 minutes ago Exited (0) 25 minutes ago brave_carver
root@iZ2zeicncy7vsor02veulwZ:/home/stu/docker/test# docker logs e70e0c643eee
Hello, Docker World!