Docker 学习笔记
Docker 介绍
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
数据管理
数据卷(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
本地访问云服务器的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 [容器名称]