Docker 学习笔记

Docker 介绍

docker_pic

Docker 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本。使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松。

Docker 容器技术与传统虚拟机技术的比较:

特性 容器 虚拟机
启动速度 秒级 分钟级
性能 接近原生 较弱
内存代价 很小 较多
硬盘使用 一般为 MB 一般为 GB
运行密度 单机支持上千个容器 一般几十个
隔离性 安全隔离 完全隔离
迁移性 优秀 一般

安装 Docker

CentOS 环境下安装 Docker

Docker 目前支持 CentOS 7 及以后的版本。系统的要求跟 Ubuntu 情况类似,64 位操作系统,内核版本至少为 3.10。

首先,为了方便添加软件源,以及支持 devicemapper 存储类型,安装如下软件包:

$ sudo yum update
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
# 添加 Docker 稳定版本的 yum 软件源:
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 之后更新 yum 软件源缓存,并安装 Docker:
$ sudo yum update
$ sudo yum install -y docker-ce
# 最后,确认 Docker 服务启动正常:
$ sudo systemctl start docker

Windows 环境下安装 Docker

对 Windows 10 的用户来说,Docker 官方为 64 位 Windows 10 Pro 环境(需支持 Hyper-V)提供了原生虚拟化应用 Docker for Windows。Windows 环境下 Docker CE 同样支持两个版本:稳定版和测试版。下载地址:https://docs.docker.com/desktop/windows/install/。

Docker 设置国内镜像源

1、创建或修改 daemon.json

daemon.json 文件路径为:/etc/docker/daemon.json,使用 vi 或 vim 打开 daemon.json

vim /etc/docker/daemon.json

2、daemon.json 配置

直接复制粘贴以下内容:创建或修改 /etc/docker/daemon.json 文件,修改为如下形式

{
 "registry-mirrors" : [
   "https://mirror.ccs.tencentyun.com",
   "http://registry.docker-cn.com",
   "http://docker.mirrors.ustc.edu.cn",
   "http://hub-mirror.c.163.com"
 ],
 "insecure-registries" : [
   "registry.docker-cn.com",
   "docker.mirrors.ustc.edu.cn"
 ],
 "debug" : true,
 "experimental" : true
}

国内加速地址有:

Docker中国区官方镜像 https://registry.docker-cn.com
网易 http://hub-mirror.c.163.com
ustc https://docker.mirrors.ustc.edu.cn
中国科技大学 https://docker.mirrors.ustc.edu.cn
阿里云容器 服务 https://cr.console.aliyun.com/ 首页点击“创建我的容器镜像” 得到一个专属的镜像加速地址,类似于“https://1234abcd.mirror.aliyuncs.com

3、重启docker

sudo systemctl daemon-reload
sudo systemctl restart docker
service docker restart

其他操作系统的安装方法可自行查阅

Docker 镜像

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。分层存储的特征使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。

常用命令

# 搜索镜像
docker search [option] [keyword]
# eg. docker search mysql
# 获取镜像,具体的选项可以通过 docker pull --help 命令
docker pull [option] [Docker Registry URL[:port]/]仓库名[:tag]
# 查看下载的镜像
docker images
docker image ls
# 查看镜像的详细信息
docker inspect [image]
docker inspect -f {{"{.[prop]}"}} [image]
# 删除镜像
docker rmi [镜像名/镜像ID]
docker image rm [镜像名/镜像ID]

创建镜像

使用 Dockerfile 定制镜像

Dockerfile 是用来构建 Docker 镜像的脚本文件。

# 默认执行 PATH/Dockerfile
docker build [-f] [Dockerfile] -t [image]:[tag] [.]

Dockerfile 指令详解:

指令 含义
FROM 基础镜像
MAINTAINER 维护者信息 “姓名<邮箱>”
RUN 镜像构建的时候需要运行的命令
ADD 复制文件进容器(会自动解压)
WORKDIR 设置当前工作目录
VOLUME 设置卷,挂载主机目录
EXPOSE 指定对外的端口
CMD 容器启动的时候运行的命令(只执行最后一条)
ENTRYPOINT 容器启动的时候运行的命令(追加命令)
ONBUILD 构建子镜像的指令触发器(不能隔代继承)
COPY 类似 ADD
ENV 设置环境变量

其他方式

# 基于已有容器创建(不建议使用)
docker commit [OPTIONS] [容器名/容器ID] [REPOSITORY[:TAG]]
# 基于本地模板导入
docker import [OPTIONS] file[URL] - [REPOSITORY[:TAG]]

导出/导出镜像

# eg. 导出本地的 ubuntu:18.04 镜像为文件 ubuntu_18.04.tar
docker save -o ubuntu_18.04.tar ubuntu:18.04
# 导入
docker load -i ubuntu_18.04.tar

Docker 容器

镜像 Image 和容器 Container 的关系,就像是面向对象程序设计中的实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

常用命令

# 查看运行中的容器(-a 为所有的容器)
docker container ls [-a]
docker ps [-a]
# 运行容器(-d 为后台运行,-p 为映射端口)
docker run --name [容器名] [-d] [-p [主机IP]:[容器IP]] [镜像名/镜像ID]
# 启动容器
docker start [容器名/容器ID]
# 停止容器
docker stop/kill [容器名/容器ID]
# 重启容器
docker restart [容器名/容器ID]
# 删除已停止的容器(-f 为强制删除)
docker rm [-f] [容器名/容器ID]
# 清理所有处于终止状态的容器
docker prune
# 修改容器名称
docker rename [旧容器名] [新容器名]
# 查看容器日志
docker logs [容器名/容器ID]
# 查看容器运行状态信息
docker stats
# 获取容器/镜像的元数据
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
# 查看容器中运行的进程信息,支持 ps 命令参数
docker top [OPTIONS] CONTAINER [ps OPTIONS]

进入容器

# 查看容器内部的文件
docker exec [容器名/容器ID] ls -a /
# 查看更详细的内容
docker exec [容器名/容器ID] ls -al /
# 进入容器后打开新的终端
docker exec -it [容器名/容器ID] /bin/bash
# 进入容器正在执行的终端
docker attach [容器名/容器ID]

文件管理

# 将宿主机目录拷贝到容器目录
docker cp [path1] [容器名/容器ID]:[path2]
# 将容器目录拷贝到宿主机目录
docker cp [容器名/容器ID]:[path2] [path1]

导入/导出容器

# 导出
docker export [容器名/容器ID] > [filename].tar
# 导入
cat [filename].tar | docker import - [容器名/容器ID:[tag]]

访问仓库

Docker Hub 是 Docker 官方提供的最大的公共镜像仓库,目前包括了超过 100k 的镜像,地址为 https://hub.docker.com。大部分对镜像的需求,都可以通过在 Docker Hub 中直接下载镜像来实现。

注册
可以在 https://hub.docker.com 免费注册一个 Docker 账号。

登录
可以通过执行 docker login 命令交互式的输入用户名及密码来完成在命令行界面登录 Docker Hub。 你可以通过 docker logout 退出登录。

拉取镜像
可以通过 docker search 命令来查找官方仓库中的镜像,并利用 docker pull 命令来将它下载到本地。

上传镜像

$ docker tag test:latest user/test:latest
$ docker push user/test:latest
The push refers to a repository [docker.io/user/test]
Sending image list
# 第一次上传时,会提示输入登录信息或进行注册,之后登录信息会记录到本地 ~/.docker 目录下
Please login prior to push:
Username:
Password:
Email:

# 登入/登出 Docker Hub
$ docker login
$ docker logout

数据管理

docker 数据管理

数据卷(volume)

数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷 可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即使容器被删除

使用数据卷

# 指定路径挂载 -v
docker run -it -v [主机目录]:[容器目录] [CONTAINER]
docker run -it --mount type=bind,source=[主机目录],target=[容器目录] [CONTAINER]
# 匿名挂载
docker run -it -v [容器目录] [CONTAINER]
# 具名挂载
docker run -it -v [volume名称]:[容器目录] [CONTAINER]
docker run -it --mount source=[volume名称],target=[容器目录] [CONTAINER]
# 修改读写权限
docker run -it -v [主机目录]:[容器目录]:[ro/rw] [CONTAINER]
docker run -it --mount type=bind,source=[主机目录],target=[容器目录],[readonly/readwrite] [CONTAINER]
# 查看详情
docker volume inspect [volume名称]
# 清理无效数据卷
docker volume prune

数据卷容器(容器间文件共享)

# 下面三个容器共享一个文件系统,双向拷贝关系(删除一个不影响其余两个的文件共享)
docker run -it --name centos01 centos
docker run -it --name centos02 --volumes-from centos01 centos
docker run -it --name centos03 --volumes-from centos01 centos

Docker 网络

TODO

常用软件/服务安装部署 [updating…]

neo4j

https://www.cnblogs.com/caoyusang/p/13610408.html

Clickhouse

https://www.cnblogs.com/jhno1/p/15993519.html

Canal-Server

https://blog.csdn.net/qq2276031/article/details/120234122

EMQ X

https://hub.docker.com/_/emqx

本地访问云服务器的EMQX localhost Dashboard 管理页面:https://blog.csdn.net/weixin_43971328/article/details/122009840

Dockerfile 部署 Spring Boot 项目

1、创建一个 Spring Boot 项目并且打成 jar 包

2、在 Linux 中创建一个文件夹,来做 Docker 测试

mkdir /root/docker_test

3、将 jar 包上传到 Linux 中

创建存放 jar 包的文件夹

mkdir /root/docker_test/jar

然后利用 XShell 上传 jar 包到上面的文件夹中

4、编写 Dockerfile 文件

# 基于java镜像创建新镜像
FROM java:8
# 作者
MAINTAINER LPxz
# 将jar包添加到容器中并更名为app.jar
ADD  jar/app.jar /root/docker_test/app.jar
# 运行jar包
ENTRYPOINT ["nohup","java","-jar","/root/docker_test/app.jar","&"]

注意:ADD、COPY 指令用法一样,唯一不同的是 ADD 支持将归档文件(tar, gzip, bzip2, etc)做提取和解压操作。还有需要注意的是,COPY 指令需要复制的目录一定要放在 Dockerfile 文件的同级目录下。

5、制作镜像

docker build -t sbdemo .

命令参数:

  • -t:指定新镜像名
  • .:表示Dockfile在当前路径

如果我们的 Dockerfile 文件路径不在这个目录下,或者有另外的文件名,我们可以通过 -f 选项单独给出 Dockerfile 文件的路径

docker build -t sbdemo -f /root/docker_test/Dockerfile /root/docker_test/

命令参数:

  • -f:第一个参数是 Dockerfile 的路径,第二个参数是 Dockerfile 所在文件夹制作完成后通过 docker images 命令查看我们制作的镜像:
$ docker images | grep sbdemo
sbdemo              latest              7efac46ef997        4 hours ago         686MB

6、启动容器

docker run -d -p 8888:8888 --name mysbdemo sbdemo:latest

命令参数:

  • -d:后台运行
  • -p:公开指定端口号
  • –name:给容器命名

启动后可通过 docker ps 查看正在运行的容器:

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
5096c8c7b36f        sbdemo              "nohup java -jar /ro??   4 seconds ago       Up 2 seconds        0.0.0.0:8888->8888/tcp   mysbdemo

7、查看容器启动日志

我们可以通过 docker logs 查看指定容器的日志:

$ docker logs mysbdemo

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.6.RELEASE)

2019-10-11 02:10:46.264  INFO 1 --- [           main] com.hyf.DatabaseApplication              : Starting DatabaseApplication v0.0.1-SNAPSHOT on 6d85ac5d8751 with PID 1 (/root/docker_test/app.jar started by root in /)
2019-10-11 02:10:46.267 DEBUG 1 --- [           main] com.hyf.DatabaseApplication              : Running with Spring Boot v2.1.6.RELEASE, Spring v5.1.8.RELEASE
2019-10-11 02:10:46.268  INFO 1 --- [           main] com.hyf.DatabaseApplication              : No active profile set, falling back to default profiles: default
2019-10-11 02:10:49.139  WARN 1 --- [           main] o.m.s.mapper.ClassPathMapperScanner      : Skipping MapperFactoryBean with name 'bookMapper' and 'com.hyf.mapper.BookMapper' mapperInterface. Bean already defined with the same name!
2019-10-11 02:10:49.139  WARN 1 --- [           main] o.m.s.mapper.ClassPathMapperScanner      : No MyBatis mapper was found in '[com.hyf]' package. Please check your configuration.
2019-10-11 02:10:49.246  INFO 1 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
2019-10-11 02:10:49.257  INFO 1 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.
2019-10-11 02:10:49.328  INFO 1 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 39ms. Found 0 repository interfaces.
2019-10-11 02:10:50.345  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$2c6b335] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-10-11 02:10:51.255  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8888 (http)
2019-10-11 02:10:51.359  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-10-11 02:10:51.359  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.21]
2019-10-11 02:10:51.778  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-10-11 02:10:51.779  INFO 1 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 5104 ms
2019-10-11 02:10:54.164  INFO 1 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-10-11 02:10:56.081  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8888 (http) with context path ''
2019-10-11 02:10:56.090  INFO 1 --- [           main] com.hyf.DatabaseApplication              : Started DatabaseApplication in 11.49 seconds (JVM running for 12.624)

8、访问接口

容器启动后,我们尝试使用 Apipost 或者浏览器去访问部署在容器中的应用接口。

Tips

1)查看容器创建时的命令

pip3 install runlike
docker ps
runlike -p [容器名称]

Docker 学习笔记
http://lpxz.work/posts/61505/
作者
LPxz
发布于
2022年7月4日
许可协议