DOCKER学习笔记
1.WSL & Docker Desktop
下载Dockers Desktop
,集成wsl
,然后直接在wsl
中使用docker
命令,详细见如下教程:
https://docs.microsoft.com/zh-cn/windows/wsl/tutorials/wsl-containers
2.DOCKER服务相关
-
手动启动
docker
:sudo service docker start
-
手动停止
docker
:sudo service docker stop
-
手动重启
docker
:sudo service docker restart
-
查看
docker
运行状态:sudo service docker status
-
查看
docker
版本:docker --version
-
避免每次执行
docker
命令都需要sudo
权限sudo groupadd docker sudo usermod -aG docker $USER newgrp docker sudo chown "$USER":"$USER" /home/"$USER"/.docker -R sudo chmod g+rwx "$HOME/.docker" -R reference: https://docs.docker.com/engine/install/linux-postinstall/
-
docker
开机自启动【具体可以参考官方文档】// 开启自启动 sudo systemctl start docker // 关闭自启动 sudo systemctl stop docker
3.DOCKER镜像相关
Docker 镜像原理: 分层 + 叠加
-
配置阿里云镜像加速器:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
路径:阿里云官网–> 容器镜像服务 --> 镜像加速器
-
查看本地镜像:
sudo docker images
|docker image ls
-
搜索镜像:
docker search xxx
-
下载镜像:
docker image pull image_name:version
-
删除镜像:
docker image rm [imageName:version | imageID] docker rmi [imageName:version | imageID]
4.DOCKER容器相关
-
查看正在运行的容器:
docker ps
-
运行容器:
docker container run -it imagename docker container run -id imagename 参数说明: -i: 保持容器运行,通常与 -t 同时使用。加入 it 这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。 -t: 为容器重新分配一个伪终端,通常与-i同时使用 -d: 以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec进入容器。退出后,容器不会关闭。 -it: 创建的容器一般称为交互式容器 -id: 创建的容器一般称为守护式容器 --name: 为创建的容器命令
-
查看所有容器:
docker ps -a
-
停止容器:
docker stop {id}
-
重启容器:
docker restart {id}
-
删除容器:
docker rm {id}
不能删除正在运行的容器
-
查看容器信息:
docker inspect {id}
5.数据卷
概念:
- 数据卷是宿主机中的一个目录或者文件
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以被挂载多个数据卷
配置数据卷
-
创建启动容器时,使用 -v 参数设置数据卷
docker run ... -v 宿主机目录(文件):容器内目录(文件)
-
创建容器,挂载已有容器的数据卷
docker run -it --name=c1 --volumes-from c3 image:tag
6.DockerFile
6.1 镜像制作方法
制作镜像时,目录挂载不会生效,但是容器根目录下的文件会生效(非挂载)
-
方法一:容器转成镜像
docker commit 容器id 镜像名称:版本号 docker save -o 压缩文件名称 镜像名称:版本号
-
方法二:
DockerFile
6.2 DockerFile
关键字 | 作用 | 备注 |
---|---|---|
FROM | 指定父镜像 | 指定dockerfile 基于哪个image 构建 |
MAINTAINER | 作者信息 | 用来表明这个dockerfile 的作者 |
LABEL | 标签 | 用来表明dockerfile 的标签,可以使用Label 代码,最终都是在docker image 基本信息中可以查看 |
RUN | 执行命令 | 执行一段命令默认是 /bin/bash 格式,RUN command 或者 RUN ["command","param1","param2"] |
CMD | 容器启动命令 | 启动容器时候的默认命令和EXTRYPOINT ,格式为:CMD command param1 param2 或者 CMD ["command","param1","param2"] |
COPY | 复制文件 | build 的时候复制文件到image 中 |
ADD | 添加文件 | build 的时候添加文件到image 中,不仅仅局限于当前的build 上下文,可以来源于远程服务 |
ENV | 环境变量 | 指定build 时候的环境变量,可以在启动容器的时候通过 -e 覆盖,格式:ENV name = value |
ARG | 构造参数 | 只在构建的时候使用的参数,如果ENV 中有ARG 中的重名变量,默认覆盖ARG 的参数 |
volume | 定义外部可以挂载的数据卷 | 指定build 的image 中,哪些目录可以启动的时候挂载到文件系统中,启动容器的时候使用 - v 绑定,格式VOLUME["目录"] |
EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口,启动容器的时候使用-p 来绑定暴露端口,格式:EXPOSE 8080 或者 EXPOSE 8080/udp |
WORKDIR | 工作目录 | 指定容器内部的工作目录,如果没有创建则自动创建,如果指定 / ,使用的是绝对地址,如果不是/ 开头,那么是在上一条workdir 的路径的相对路径 |
USER | 指定执行用户 | 指定build 或者启动的时候,用户在RUN CMD EXTRYPOINT 执行的时候的用户 |
HEALTHCHECK | 健康检查 | 指定检测当前容器健康检测的命令,基本上没用,因为很多时候应用本身有健康检测的机制 |
ONBUILD | 触发器 | 当存在ONBUILD 关键字的镜像作为基础镜像的时候,当执行FROM 完成之后,会执行ONBUILD 命令,但是不影响当前镜像,用处也不怎么大 |
STOPSIGNAL | 发送信号量到宿主机 | 该STOPSIGNAL 指令设置将发送到容器的系统调用信号以退出 |
SHELL | 指定执行脚本的shell | 指定RUN CMD EXTRYPOINT 执行命令的时候使用的shell |
7.Docker部署SpringBoot项目
思路一:将
JAR
包和DockerFile
一起上传至服务器思路二:本地
wsl
制作镜像,上传到私有仓库or hub.docker
,然后服务器拉取这里选择思路二实践,思路一好像也挺麻烦;思路二搭建私有仓库,一劳永逸
远程服务器为华为云服务,其中Step1 - Step4均在华为云服务器操作;Step5在本地操作。
本地Docker环境:windows subsystem for linux 2 + docker desktop,配置详见第1部分
7.1 私有仓库搭建
Step1: 服务器(华为云服务器)安装docker
这里推荐使用官方安装脚本自动安装。安装命令如下:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
也可以使用国内daocloud
一键安装命令:
curl -sSL https://get.daocloud.io/docker | sh
如果需要卸载docker,可使用如下命令:
sudo apt-get remove docker docker-engine docker.io containerd runc
Step2: 配置镜像加速服务
进入阿里云镜像加速服务界面注册,然后按照官方操作文档进行配置。
Step3: 拉取registry镜像
docker pull registry # 默认就是最新的 latest 版本
Step4: 运行registry镜像
docker run -d --name=name --restart=always -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
Step5: 测试是否搭建成功
-
在本地拉取
ubuntu:16.04
docker pull ubuntu:16.04
可以使用
docker images
命令查看是否拉取成功 -
制作ubuntu新的tag
docker tag ubuntu:16.04 your-ip:5000/your-image-name
-
上传镜像到私有仓库
docker push your-ip:5000/your-image-name
此处可能报错:http: server gave HTTP response to HTTPS client
解决方案,在docker desktop中,编写如下配置信息
马赛克部分:
"insecure-registries" : ["ip:port"]
ps: 第二处马赛克为配置阿里云镜像加速服务,详见STEP 2
编写好配置信息后,重启docker,然后重新执行docker push命令
-
检查是否成功上传
执行命令:
curl ip:5000/v2/_catalog
ps: 为搭建私有仓库的服务器IP,如果repositories中出现刚上传的image的名称,则表示搭建成功
-
测试拉取镜像
测试前先删除之前的tag,即执行命令:
docker rmi ip:port/your-image-name
然后拉取镜像,执行:
docker pull port:5000/your-image-name
不出意外应该会拉取成功,如下图:
7.2 用wsl制作镜像
// todo 项目本身也不复杂,就用到了mysql + jdk 依赖,所以7.2、7.3、7.4加上todo标签吧,以后有需求再来学!
ddl和业务需求是第一驱动力!
7.3 镜像上传
// todo
7.4 镜像拉取&运行
// todo