Docker 学习笔记
Docker 是一个跨平台、可移植并且简单易用的容器解决方案。基于 Go 语言开发。
Docker 可在容器内部快速自动化地部署应用,并通过操作系统内核技术(namespaces、cgroup等)为容器提供资源隔离和安全保障。
《Docker — 从入门到实践》 – docker 中文白皮书
https://yeasy.gitbooks.io/docker_practice/content/
https://github.com/yeasy/docker_practice
learn to build and deploy your distributed applications easily to the cloud with docker
https://docker-curriculum.com/
https://www.cnblogs.com/sparkdev/p/11237347.html
https://docs.docker.com/network/
安装 Docker 时,它会自动创建 3 个网络。可以使用 docker network ls 命令列出这些网络。
这 3 个网络包含在 Docker 实现中。运行一个容器时,可以使用 --net 标志指定您希望在哪个网络上运行该容器。您仍然可以使用这 3 个网络。
bridge 网络表示所有 Docker 安装中都存在的 docker0 网络。除非使用 docker run --net=<NETWORK> 选项另行指定,否则 Docker 守护进程默认情况下会将容器连接到此网络。在主机上使用 ifconfig命令,可以看到此网桥是主机的网络堆栈的一部分。
none 网络在一个特定于容器的网络堆栈上添加了一个容器。该容器缺少网络接口。
host 网络在主机网络堆栈上添加一个容器。您可以发现,容器中的网络配置与主机相同。
bridge 即桥接网络,以桥接模式连接到宿主机,即宿主机和容器之间通过 docker0 虚拟网卡连到同一个局域网。bridge是默认的网络模式
host 宿主网络,即与宿主机共用网络,这种模式相当于没有网络隔离,好处是和宿主机处于同一网络,可随意访问,都不用-p做端口映射了。
none 则表示无网络,容器将无法联网
overlay 跨主机网络。
在早期的docker版本中,是不支持跨主机通信网络驱动的,也就是说明如果容器部署在不同的节点上面,只能通过暴露端口到宿主机上,再通过宿主机之间进行通信。
docker 1.9 之后,随着docker swarm集群的推广,docker也有了自家的跨主机通信网络驱动,名叫overlay,overlay网络模型是swarm集群容器间通信的载体,将服务加入到同一个网段上的Overlay网络上,服务与服务之间就能够通信。
https://docs.docker.com/network/bridge/
安装 Docker 的时候,会在宿主机安装一个虚拟网卡 docker0, 它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。
$ ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:88ff:fe56:8251 prefixlen 64 scopeid 0x20<link>
ether 02:42:88:56:82:51 txqueuelen 0 (Ethernet)
RX packets 915966 bytes 2933746454 (2.7 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 875092 bytes 62233810 (59.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。例如Linux下一般是 172.17.0.1 , 并不固定。
它还给出了 MTU(接口允许接收的最大传输单元),通常是 1500 Bytes,或宿主主机网络路由上支持的默认值。
这些值都可以在服务启动的时候进行配置。
https://docs.docker.com/network/host/
host 网络和主机之间没有隔离,和主机共享一个 network namespace.
注意:使用 host 网络模式时,端口映射不起作用。 docker run 时的 -p, --publish, -P, --publish-all 参数会被忽略,并产生一条警告:
WARNING: Published ports are discarded when using host network mode
https://docs.docker.com/docker-for-mac/networking/
https://learn.lianglianglee.com/专栏/由浅入深吃透%20Docker-完/11%20%20组件组成:剖析%20Docker%20组件作用及其底层工作原理.md
https://coolshell.cn/articles/17010.html
https://coolshell.cn/articles/17049.html
https://www.cnblogs.com/sparkdev/p/9032209.html
RunC 是一个轻量级的容器运行工具,用来运行按照 OCI(Open Container Initiative) 标准格式打包的容器。
RunC 是用 golang 创建的项目。
RunC 是标准化容器运行时的一个实现,是 docker 内置的默认容器运行时。
https://containerd.io/docs/
Containerd 简介
https://www.cnblogs.com/sparkdev/p/9063042.html
containerd 是一个工业级标准的容器运行时,可以在宿主机中管理完整的容器生命周期:容器镜像的传输和存储、容器的执行和管理、存储和网络等。
containerd 是从 docker 中分离出来的,或者说 containerd 本身是 docker 的一部分。
containerd 并不是直接面向最终用户的,而是主要用于集成到更上层的系统里,比如Swarm, Kubernetes, Mesos等容器编排系统。
containerd 以 Daemon 的形式运行在系统上,通过 unix domain socket 暴露很底层的 gRPC API,上层系统可以通过这些 API 管理机器上的容器。每个 containerd 只负责一台机器,Pull 镜像,对容器的操作(启动、停止等),网络,存储都是由 containerd 完成。具体运行容器由 runC 负责,实际上只要是符合 OCI 规范的容器都可以支持。
https://docs.docker.com/install/linux/docker-ce/centos/
CentOS 安装 Docker CE
https://yeasy.gitbooks.io/docker_practice/install/centos.html
Docker 入门教程
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
前提条件:
1 安装 Docker Engine - Community 需要 CentOS 7 版本及以上,老版本不支持。
2 需要开启 centos-extras yum repo,默认是开启的。
https://docs.docker.com/docker-for-mac/install/
macOS 安装 Docker Desktop CE
https://yeasy.gitbooks.io/docker_practice/install/mac.html
Docker Desktop for Mac 要求系统最低为 2010 年以后的 Mac 机型,准确说是带 Intel MMU 虚拟化的, macOS 10.13 及以上版本, 最低 4GB 内存。
如果不满足已上要求,可以使用 Docker Toolbox 安装 Docker 来代替 Docker Desktop, Docker Toolbox 使用 Oracle VirtualBox 虚拟机而不是 HyperKit 虚拟机。
http://localhost,如果看到了 “Welcome to nginx!”,就说明 Docker Desktop for Mac 安装成功了。
https://docs.docker.com/engine/reference/builder/
https://docs.docker.com/engine/api/sdk/examples/
https://docs.docker.com/engine/reference/commandline/cli/
https://docs.docker.com/engine/reference/commandline/system_df/
docker system df 查看 docker 磁盘占用汇总信息
docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 433 42 117.4GB 97.11GB (82%)
Containers 103 89 2.145GB 1.464GB (68%)
Local Volumes 9 6 116B 58B (50%)
Build Cache 0 0 0B 0B
RECLAIMABLE 是空闲镜像(没有任何容器使用的镜像)的大小,空闲镜像可以用命令 docker image prune -a 清理
https://docs.docker.com/engine/reference/commandline/system_prune/
docker system prune 会清理
已停止的容器
没被使用的网络
docker build 缓存
https://docs.docker.com/engine/reference/commandline/image_prune/
docker image prune -a 命令可批量清理悬空镜像
docker images 看到的 none 镜像是悬空镜像(dangling images),即无标签、且不被容器使用的镜像。
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 5eaed6e23874 10 minutes ago 741MB
https://docs.docker.com/engine/reference/commandline/run/
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
以镜像 IMAGE 启动一个容器, 如果 IMAGE 不存在,会从默认仓库 Docker Hub 上下载此镜像,如果不指定 tag 默认是 latest,启动容器后执行命令 COMMAND
例如
docker run -it --rm ubuntu:18.04 bash 直接运行 ubuntu 镜像并进入启动的 Ubuntu 容器
ubuntu:18.04:这是指用 ubuntu:18.04 镜像为基础来启动容器。
bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash
参数
-d, --detach 让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下
-e, --env list 启动容器时增加环境变量
-p, --publish <宿主端口>:<容器端口> 映射宿主端口和容器端口,-p 标记可以多次使用来绑定多个端口。例如 -p 80:8080 映射本机 80 端口到容器内的 8080 端口
-P, --publish-all 随机映射宿主机上一个 49000~49900 之间的端口到容器内部的网络端口
--name string 指定启动的容器的名字
--restart string 容器退出后的重启策略,默认是 no, --restart=always 可保持容器一直运行
--rm 容器退出后随之将其删除。默认情况下,为了启动失败时查错,退出的容器并不会立即删除,除非手动 docker rm。
https://segmentfault.com/a/1190000015684472
Use volumes
https://docs.docker.com/storage/volumes/
https://docs.docker.com/engine/reference/commandline/push/
推镜像到 registry
docker push image[:tag]
https://docs.docker.com/engine/reference/commandline/image_inspect/
https://hub.docker.com/r/adoptopenjdk/openjdk8/tags?page=1&name=centos
可以通过 docker manifest inspect 查看镜像支持哪些架构
当用户获取一个镜像时,Docker 引擎会首先查找该镜像是否有 manifest 列表,如果有的话 Docker 引擎会按照 Docker 运行环境(系统及架构)查找出对应镜像(例如 golang:alpine)。如果没有的话会直接获取镜像(例如上例中我们构建的 username/test)。
docker manifest inspect adoptopenjdk/openjdk8:centos
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"manifests": [
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 956,
"digest": "sha256:099e5eda268dc834873028c94eb7031d2acb2dad0ce92edccee78d6fd7666b7b",
"platform": {
"architecture": "arm64",
"os": "linux",
"variant": "v8"
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 953,
"digest": "sha256:c185c64ed5993198248bf8aad74e706077b34ee30f7d0260e19c55397ac0f2f2",
"platform": {
"architecture": "arm",
"os": "linux",
"variant": "v7"
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 954,
"digest": "sha256:65147bda6f81bfba8922d4c3ae896184551ac5d8fe750e3ba9916846b9eadb91",
"platform": {
"architecture": "ppc64le",
"os": "linux"
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 954,
"digest": "sha256:d2c6b89782cc256d9cef8b4dd72623f7594eb935ba62ba762ddfc17aaace8bbb",
"platform": {
"architecture": "amd64",
"os": "linux"
https://docs.docker.com/engine/reference/commandline/pull/
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
具体的选项可以通过 docker pull –help 命令看到
Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。
仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。
例如 docker pull ubuntu:18.04
上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。
而镜像名称是 ubuntu:18.04,因此将会获取官方镜像 library/ubuntu 仓库中标签为 18.04 的镜像。
https://blog.51cto.com/forangela/1949947
https://docs.docker.com/engine/reference/commandline/build/
docker build [选项] <上下文路径/URL/->
-t, --tag 指定 image 文件的名字,后面还可以用冒号指定标签,例如 name:tag。如果不指定,默认的标签就是 latest
-f, --file 指定 Dockerfile 文件名称,默认是 PATH/Dockerfile
docker build -t myapp . 在当前目录使用 Dockerfile 构建 myapp 镜像
docker build -t myapp -f path-to-Dockerfile . 在当前目录使用 path-to-Dockerfile 构建 myapp 镜像
https://docs.docker.com/engine/reference/commandline/history/
查看镜像历史
--no-trunc 不截断输出结果,不加这个选项的话 CREATED BY 中显示不全
docker history zookeeper:3.4.14
IMAGE CREATED CREATED BY SIZE COMMENT
4b03fe5b3f64 2 months ago /bin/sh -c #(nop) CMD ["zkServer.sh" "start… 0B
<missing> 2 months ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B
<missing> 2 months ago /bin/sh -c #(nop) COPY file:9258d11b841666f1… 1.16kB
<missing> 2 months ago /bin/sh -c #(nop) ENV PATH=/usr/local/openj… 0B
<missing> 2 months ago /bin/sh -c #(nop) EXPOSE 2181 2888 3888 0B
<missing> 2 months ago /bin/sh -c #(nop) VOLUME [/data /datalog /l… 0B
<missing> 2 months ago /bin/sh -c #(nop) WORKDIR /zookeeper-3.4.14 0B
<missing> 2 months ago |2 DISTRO_NAME=zookeeper-3.4.14 GPG_KEY=3F7A… 60MB
<missing> 2 months ago /bin/sh -c #(nop) ARG DISTRO_NAME=zookeeper… 0B
<missing> 2 months ago /bin/sh -c #(nop) ARG GPG_KEY=3F7A1D16FA421… 0B
<missing> 2 months ago /bin/sh -c set -eux; apt-get update; … 12.3MB
<missing> 2 months ago /bin/sh -c set -eux; groupadd -r zookeep… 329kB
<missing> 2 months ago /bin/sh -c #(nop) ENV ZOO_CONF_DIR=/conf ZO… 0B
<missing> 2 months ago /bin/sh -c set -eux; arch="$(dpkg --print-… 109MB
<missing> 2 months ago /bin/sh -c #(nop) ENV JAVA_VERSION=8u292 0B
<missing> 2 months ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0B
<missing> 2 months ago /bin/sh -c #(nop) ENV PATH=/usr/local/openj… 0B
<missing> 2 months ago /bin/sh -c { echo '#/bin/sh'; echo 'echo "$J… 27B
<missing> 2 months ago /bin/sh -c #(nop) ENV JAVA_HOME=/usr/local/… 0B
<missing> 2 months ago /bin/sh -c set -eux; apt-get update; apt-g… 8.82MB
<missing> 2 months ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 2 months ago /bin/sh -c #(nop) ADD file:7362e0e50f30ff454… 69.3MB
https://docs.docker.com/engine/reference/commandline/save/
保存镜像到 tar 文件,默认输出到 stdout, 默认包含所有的 layer, 所有的tags, 当然也可以指定tags
-o, --output docker save 默认是输出到 stdout, 通过 -o 参数可指定保存的档案文件名
docker save busybox > busybox.tar 保存镜像 busybox 的所有版本到 busybox.tar 文件
docker save -o myimage.tar myimage:tag1 保存镜像 myimage 的 tag1 版本到 myimage.tar 文件
https://docs.docker.com/engine/reference/commandline/load/
从 tar 文件或标准输入 stdin 导入镜像,会重建镜像和所有的 tag.
这里的 tar 文件是用 docker save 命令导出的镜像。
--input , -i : 指定导入的文件,代替 STDIN。
--quiet , -q : 精简输出信息。
docker load < busybox.tar.gz 利用输入重定向从 tar 文件导入镜像
docker load --input fedora.tar 通过 --input 参数指定 tar 文件导入镜像
https://docs.docker.com/engine/reference/commandline/cp/
docker cp 等于 docker container cp
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
示例
1、将容器中的文件 /root/123.mp4 拷贝到宿主机的 /root/mp4/ 目录中,其中 335d957237c9 是容器id
docker cp 335d957237c9:/root/123.mp4 /root/mp4/
2、将容器中的 /root/images 目录拷贝到宿主机的 /root/data/ 目录中,其中 335d957237c9 是容器id
docker cp 335d957237c9:/root/images /root/data/
3、将宿主机当前目录中的 xx.mp4 文件拷贝到容器的 /root/data/ 目录中,其中 video-processor 是容器名
docker cp xx.mp4 video-processor:/root/data/
https://docs.docker.com/engine/reference/commandline/tag/
docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
重命名镜像,将 source 重命名为 target
docker tag myapp:ver1 myapp:ver2
https://github.com/docker/compose
Compose安装
https://containerization-automation.readthedocs.io/zh_CN/latest/docker/compose/Compose%E5%AE%89%E8%A3%85/
https://docs.docker.com/compose/install/
https://docs.docker.com/compose/compose-file/
https://yeasy.gitbook.io/docker_practice/compose/commands
https://docs.docker.com/compose/networking/
https://docs.docker.com/compose/compose-file/#network_mode
https://hub.docker.com/
https://github.com/NVIDIA/nvidia-docker
nvidia-docker 相关组件
nvidia-docker2
nvidia-container-runtime
nvidia-container-toolkit
libnvidia-container
之间的关系
What’s the difference between the lastest nvidia-docker and nvidia container runtime? #1268
https://github.com/NVIDIA/nvidia-docker/issues/1268
https://hub.docker.com/r/nimmis/java-centos/tags?page=1&name=openjdk-8
Dockerfile
https://github.com/nimmis/docker-java-centos/blob/master/openjdk-8-jdk/Dockerfile
只有amd64架构的
docker pull nimmis/java-centos:openjdk-8-jdk
REPOSITORY TAG IMAGE ID CREATED SIZE
nimmis/java-centos openjdk-8-jdk 8a93794b15b0 5 years ago 402MB
也可以自己构建:
1、创建 centos7-openjdk8.Dockerfile
FROM centos:7
MAINTAINER masikkk.com
RUN yum update -y && \
yum install -y wget && \
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel && \
yum clean all
# Set environment variables.
ENV HOME /root
# Define working directory.
WORKDIR /root
# Define default command.
CMD ["java","-version"]
2、构建镜像
进入 centos7-openjdk8.Dockerfile 文件所在目录
docker build -f centos7-openjdk8.Dockerfile -t centos7-openjdk8 .
结果
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7-openjdk8 latest 385f79d1ce5f 18 hours ago 1.28GB
3、运行镜像,由于 Dockerfile 里的 CMD 命令就是 java -version,docker run 可直接看到 java 版本
docker run centos7-openjdk8
openjdk version "1.8.0_372"
OpenJDK Runtime Environment (build 1.8.0_372-b07)
OpenJDK 64-Bit Server VM (build 25.372-b07, mixed mode)
也可以进入镜像看看 java 版本
docker run -it –rm centos7-openjdk8 bash
[root@a4f6988524c5 ~]# java -version
openjdk version "1.8.0_372"
OpenJDK Runtime Environment (build 1.8.0_372-b07)
OpenJDK 64-Bit Server VM (build 25.372-b07, mixed mode)
https://hub.docker.com/r/adoptopenjdk/openjdk8/tags?page=1&name=centos
Dockerfile 文件
https://github.com/AdoptOpenJDK/openjdk-docker/blob/master/8/jdk/centos/Dockerfile.hotspot.releases.full
注意此镜像有多种架构,M1 Mac 上默认会拉取 arm64 架构的版本,如果想要使用 amd64/x86_64 架构版本,需要通过 --platform amd64 参数指定
docker pull adoptopenjdk/openjdk8:centos –platform amd64
docker pull adoptopenjdk/openjdk8:centos-slim –platform amd64
REPOSITORY TAG IMAGE ID CREATED SIZE
adoptopenjdk/openjdk8 centos-slim f7719a74b210 17 hours ago 471MB
adoptopenjdk/openjdk8 centos a72f04e4db6d 17 hours ago 579MB
https://spring.io/guides/gs/spring-boot-docker/
docker hub / openjdk
https://hub.docker.com/_/openjdk
https://hub.docker.com/_/nginx
Nginx 容器教程
https://www.ruanyifeng.com/blog/2018/02/nginx-docker.html
https://prometheus.io/docs/prometheus/latest/installation/
docker 太方便了,准备好配置文件后直接启动就行,自动从 dockerhub 拉取最新官方镜像
我的启动命令如下:
docker run -d --rm \
--network host \
--name prometheus \
-v /home/centos/git/masikkk/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
解释下:
-d 后台运行
--rm 停止容器后删掉容器文件
--network host 与宿主机完全共享网络,默认是bridge桥接,无法在nginx中通过localhost转发请求
--name grafana 指定启动的容器名,方便按名称stop等操作
-v 映射配置文件,具体说是宿主机配置文件覆盖容器中的配置文件,我的配置文件在 git 仓库中,方便保存,也可以记录修改历史。
参考笔记 Prometheus
https://grafana.com/docs/grafana/latest/installation/
Installing using Docker
https://grafana.com/docs/grafana/latest/installation/docker/
第一次执行时直接从 dockerhub 拉取最新版本 grafana
docker run -d --rm \
--network host \
--name grafana \
grafana/grafana
解释下:
-d 后台运行
--rm 停止容器后删掉容器文件
--network host 与宿主机完全共享网络,默认是bridge桥接,无法在nginx中通过localhost转发请求
--name grafana 指定启动的容器名,方便按名称stop等操作
参考笔记 Grafana
https://github.com/tomav/docker-mailserver
tvial/docker-mailserver
https://hub.docker.com/r/tvial/docker-mailserver
利用Docker自建多功能加密邮件服务器
https://www.itmanbu.com/docker-mail-server.html
Mail Server Docker
https://blog.liyang.info/2018/04/17/mail-server-docker/
https://m.jb51.net/article/149173.htm
https://stackoverflow.com/questions/37251309/no-fontmanager-in-java-library-path/39861372
java.lang.UnsatisfiedLinkError: no fontmanager in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at sun.font.FontManagerNativeLibrary$1.run(FontManagerNativeLibrary.java:61)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.FontManagerNativeLibrary.<clinit>(FontManagerNativeLibrary.java:32)
at sun.font.SunFontManager$1.run(SunFontManager.java:339)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.SunFontManager.<clinit>(SunFontManager.java:335)
https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.
因为通过 -v 映射了一个不在共享配置中的文件夹
Mac 系统中想要和容器共享文件夹的话,需要先配置
默认已共享了 /Users/, /Volumes/, /private/, and /tmp
可在 Preferences -> File sharing 中增加共享目录
https://docs.docker.com/network/host/
The host networking driver only works on Linux hosts, and is not supported on Docker Desktop for Mac, Docker Desktop for Windows, or Docker EE for Windows Server.
https://docs.docker.com/docker-for-mac/networking/
- 基本概念
- 为什么要用docker?
- repository 仓库
- image 镜像
- image 镜像内容
- container 容器
- image和container的区别?
- docker文件系统
- UnionFS联合文件系统
- 使用mount创建一个AUFS文件系统
- AUFS
- OverlayFS
- docker支持的UFS
- 一个容器中修改了基础镜像是否会影响其他容器?
- volume 卷
- docker Daemon与client
- docker 网络
- bridge
- host
- Mac和Windows上没有host网络
- Mac中主机和容器网络互通解决方案
- docker-proxy
- 根据 docker-proxy 端口占用找对应容器
- Docker原理
- chroot
- Linux Namespace
- Linux CGroup
- RunC
- containerd
- 安装Docker
- CentOS 安装 Docker CE
- 安装 docker repo
- yum 安装最新版 Docker
- 启动 Docker 并验证
- 将当前用户加入docker用户组
- 重启 Docker
- Docker升级到指定版本
- Mac 安装 Docker CE
- Homebrew 安装 Docker Desktop for Mac
- Dockerfile
- FROM 指定基础镜像
- COPY 复制文件
- ADD 更高级的复制文件
- WORKDIR 指定工作目录
- EXPOSE 声明端口
- RUN 执行命令
- CMD 容器启动命令
- ENTRYPOINT 入口点
- RUN/CMD/ENTRYPOINT 区别
- Shell 格式与 Exec 格式
- Docker API
- containers/json 查看容器列表
- Docker 常用命令
- docker info 查看docker信息
- 查看 Root Dir
- 查看 docker 的 cgroup driver
- docker system df 查看docker磁盘占用
- 查看docker容器占用磁盘空间大小
- docker/containers 目录磁盘占用大清理
- docker system prune 系统清理
- docker image prune -a 清理悬空镜像
- docker rmi 批量删除none镜像
- docker search
- docker network
- docker network create
- docker run 运行容器
- -it 进入容器
- --network,--net 指定容器网络模式
- -v 绑定文件/文件夹
- --mount挂载卷
- --privileged特权模式
- –platform 指定架构
- 容器无法启动问题排查
- docker push 推镜像
- docker image inspect 查看镜像详细信息
- docker image inspect 查看镜像的架构
- docker manifest inspect 查看镜像的manifest列表
- docker pull 下载镜像
- –platform 指定架构
- 修改docker镜像存储位置
- 软链接
- 修改 docker 配置文件
- 修改docker.service服务配置
- docker no space left on device
- docker images 列出本机镜像
- docker image rm 删除本地镜像
- docker build 构建镜像
- –platform 构建多架构镜像
- 构建上下文
- .dockerignore
- docker history 查看镜像历史
- docker ps 列出本机容器
- docker container start 启动已终止容器
- docker stop 终止容器
- docker rm 删除容器
- docker exec 进入容器执行命令
- OCI runtime exec failed bash executable file not found
- docker commit 将容器保存为镜像
- docker save 导出镜像
- 利用 docker save/load 导入导出镜像
- 内网下载docker镜像
- docker load 导入镜像
- docker cp 在容器和宿主机间拷贝文件/目录
- docker tag 重命名镜像
- docker logs 查看容器日志
- docker inspect 显示容器信息
- 如何查看容器的启动命令
- docker-compose
- 安装 docker-compose
- docker-compose.yml配置文件
- docker-compose.yml格式版本和docker兼容对照表
- depends_on
- docker compose 命令
- 指定配置文件
- up
- stop
- ps
- docker compose 网络
- network_mode使用默认docker网络
- docker仓库
- docker hub
- docker-registry 私人仓库
- nvidia-docker
- 实践
- busybox 镜像
- centos7-openjdk8 镜像
- nimmis/centos7-openjdk8 镜像
- AdoptOpenJDK/centos7-openjdk8 镜像
- Docker 构建部署 SpringBoot 服务
- 构建基于 openjdk:8-alpine 的 SpringBoot 服务镜像
- 构建基于 centos7-openjdk8 的 SpringBoot 服务镜像
- 启动 SpringBoot Docker 容器
- linux 中启动 SpringBoot Docker 容器
- Mac 上启动 SpringBoot Docker 容器
- Docker 容器部署 Nginx
- 拉取最新 alpine 版本 Nginx 镜像
- 启动默认 nginx:alpine 镜像
- 指定配置文件启动 nginx:alpine
- 构建自己的 nginx 镜像并启动
- nginx.conf 中的用户名必须是 nginx
- docker容器部署prometheus
- docker容器部署grafana
- docker容器部署邮件服务器
- 遇到的问题
- 容器内的nginx无法访问宿主机网络
- 查看容器中的日志
- alpine镜像中jvm工具不可用问题
- java.lang.UnsatisfiedLinkError: no fontmanager in java.library.path
- 修改容器时区
- Dockerfile中指定时区
- 基于alpine的镜像中修改时区
- Mac中使用docker时遇到的问题
- mac中映射的文件需要先设置共享
- mac上宿主机和容器互相网络访问
- M1 Mac 上构建和运行 amd64/x86_64 架构镜像