1、配置Docker
2、配置Docker镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://zlcqqwo7.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
3、Docker部署
docker原理:下载免安装的文件有可执行文件(镜像只有一个,下载了就不会下了)
docker对环境没要求类似java虚拟机(宝塔原来get)
docker内的容器之前相互隔离,容器内可以是同一端口,但一旦出了容器到达宿主机,那么就不能共享端口
4、命令解读
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql
docker run 创建并允许
-d是让容器后台运行
--name mysql:给容器起名
-p 3306:3306:设置端口映射(宿主端口:容器端口)
-e KEY=VALUE:是设置环境变量
mysql:指定运行的镜像名(镜像名:版本号)
5、常见命令
pull | 镜像仓库拉取 |
image | 镜像查看 |
rmi | 镜像删除 |
build | 自己构建镜像 |
save | 保存到本地压缩 |
load | 压缩文件加载到他的镜像 |
push | 把镜像推上镜像仓库,后同时用pull从镜像仓库拉出 |
run | 运行并创建进程 |
stop | 停止容器中的进程(容器依然在,下次运行不用重复启动) |
start | 启动已经停止的进程 |
ps | 查询容器状态 |
rm | 删除镜像 |
logs | 打印相关日志 |
exec | 进入容器(修改之类) |
命令的别名 root/.bashrc
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'
修改完后还没完,要写sourse ~/.bashrc 让该文件生效
6、Docker基础-数据卷挂载(容器内目录和宿主机目录的桥梁)
docker只具备了容器运行必备的东西(数据卷解决这个)
创建数据卷html文件夹(用docker命令创建)之后帮助你在宿主机创建对应真实的目录
/var/lib/docker/volumes/html/_data
创建数据卷conf文件夹(用docker命令创建)之后帮助你在宿主机创建对应真实的目录
/var/lib/docker/volumes/conf/_data 间接产生了关联
之后docker会让两者产生双向绑定 宿主机有高级编辑器操作方便。
docker volume --help 会产生以下指令帮助提示。
命令 | 说明 | 文档地址 |
---|---|---|
docker volume create | 创建数据卷 | |
docker volume ls | 查看所有数据卷 | |
docker volume rm | 删除指定数据卷 | |
docker volume inspect | 查看某个数据卷的详情 | |
docker volume prune | 清除数据卷 |
只需要做挂载就可以自动创建(必须在docker run命令时 使用-v 数据卷:容器内目录 可以完成数据卷的挂载。
Unable to find image 'nginx:latest' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: TLS handshake timeout.
无法下载镜像:超时
以上都未能结局我的问题
我的问题是通过宝塔删除容器、并且在目录删除了文件
解决:没有删掉对应的存储卷、存储卷不因容器的删除而删除,而是在下一次创建相同容器是自动挂载,所以要对原有的存储卷进行删除、注意宝塔的是有存储卷
本地目录挂载
mysql容器的数据挂载
需求:查看mysql容器、判断是否有数据卷挂载
基于宿主机目录实现MySQL数据目录、配置文件、初始化脚本的挂载(查阅官方镜像文档)
mysql是自动创建数据数据卷的(数据迁移问题)
自动创建的卷名字不好(匿名卷)自己挂载,挂载到任意不深的目录
-v 本地目录(原本是镜像名):容器内目录 本地挂载
不要用相对目录(本地目录必须以"/"或者"./"开头)
-v mysql:/var/lib/mysql # 会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷 -v ./mysql:/var/lib/mysql # 会被识别为当前目录下的mysql目录,运行时如果不存在会创建目录
-
挂载
/root/mysql/data
到容器内的/var/lib/mysql
目录 -
挂载
/root/mysql/init
到容器内的/docker-entrypoint-initdb.d
目录(初始化的SQL脚本目录) -
挂载
/root/mysql/conf
到容器内的/etc/mysql/conf.d
目录(这个是MySQL配置文件目录)
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v ./mysql/data:/var/lib/mysql \
-v ./mysql/conf:/etc/mysql/conf.d \
-v ./mysql/init:/docker-entrypoint-initdb.d \
mysql
6、自制镜像
镜像包含应用、程序运行的系统函数库、运行配置文件的文件包。构建镜像过程其实就是把上述文件打包的过程
镜像是分层的
我们不需要亲自去完成我们只需要指出-入口是什么、中间有那些层docker就会自动创建
Dockerfile
指令 | 说明 | 示例 |
---|---|---|
FROM | 指定基础镜像 |
|
ENV | 设置环境变量,可在后面指令使用 |
|
COPY | 拷贝本地文件到镜像的指定目录 |
|
RUN | 执行Linux的shell命令,一般是安装过程的命令 |
|
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 设定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安装JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar.gz \
&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 指定项目监听的端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]
已经有人将jdk、基础镜像、都已经做了所以
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
自定义镜像
docker build -t myImage:1.0 .
-
docker build
: 就是构建一个docker镜像 -
-t docker-demo:1.0
:-t
参数是指定镜像的名称(repository
和tag
) -
.
: 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.
代表当前目录,也可以直接指定Dockerfile目录:
构建jdk镜像将文件放在root下
docker load -i jdk.tar
# 进入镜像目录
cd /root/demo
# 开始构建
docker build -t docker-demo:1.0 .
7、Docker网络容器互联
docker会自动创建ip地址
如果重新启动Docker ip会便所以要进行自定义网络(锁死)
自定义创建一个网桥 然后网球之间的镜像互相访问,可以通过容器名访问!
命令 | 说明 | 文档地址 |
---|---|---|
docker network create | 创建一个网络 | |
docker network ls | 查看所有网络 | |
docker network rm | 删除指定网络 | |
docker network prune | 清除未使用的网络 | |
docker network connect | 使指定容器连接加入某网络 | |
docker network disconnect | 使指定容器连接离开某网络 | |
docker network inspect | 查看网络详细信息 |
docker run -d --name dd -p 8080:8080 --network heima docker-demo
#创建镜像时自动加入网桥 就不会加入默认网桥