docker

一.概念

Docker 是一个开源的应用容器引擎,可以帮助我们减轻服务部署的压力,他有三个概念:镜像、仓库、容器实例,好处是我们可以将我们的 Java 程序放到一个 Tomcat 实例中,再把该镜像放到远程仓库,任何环境想部署该 Java 应用,只需要从远程仓库下载该镜像并运行成为一个容器实例,而实例中运行着我们的 Java 程序,相当于我们构建一次镜像之后,随处运行;

容器内的应用进程直接运行于宿主的内核;

每个容器之间互相隔离,且有自己的文件系统 ,容器之间进程不会相互影响;

镜像是包含某个或多个运行服务的独立 Linux 运行环境;

镜像由一层一层的文件系统组成,这种层级的文件系统称为UnionFS;

分层的好处是可以共享资源,方便复用;

Docker镜像层都是只读的,容器层是可写的。当容器启动时,一个新的可写层被加载到镜像的顶部;

二.命令

帮助启动类

sh 复制代码
# 启动docker
systemctl start docker
# 停止docker
systemctl stop docker
# 重启docker
systemctl restart docker
# 查看docker状态
systemctl status docker
# 开机自启动
systemctl enable docker
# 查看docker概要信息
docker info
# 查看镜像/容器/数据卷所占的空间
docker system df
# 查看docker总体帮助文档
docker --help
# 查看docker命令帮助文档
docker 具体命令 --help

镜像类

sh 复制代码
# 列出本地主机上的镜像
docker images
# 从仓库中搜索镜像(https://hub.docker.com)
docker search 镜像名
# 下载镜像到本地
docker pull 镜像名:版本号
# 删除镜像(删除全部镜像: docker rmi -f $(docker images -qa))
docker rmi  -f 镜像ID

容器类

sh 复制代码
# 创建容器实例
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run -it --name zs --privileged=true -v 本机路径:容器内路径 -p 6379:6379 redis /bin/bash
--name="容器新名字"     为容器指定一个名称;
-d:                    启动后台守护式容器(后台运行,必须有一个前台进程,否则会自动退出,解决:-it , Ctrl p q)
-it:                  启动前台交互式容器
-p: 指定端口映射,小写p 
-P: 随机端口映射,大写P 
-v:挂载数据卷(保证容器内数据的持久化,容器删除时,数据仍在)
# 退出容器终端并停止容器
exit
# 退出容器终端但不停止容器
Ctrl p q
# 列出当前正在运行的容器实例(所有: -a)
docker ps
# 启动已停止运行的容器
docker start 容器ID
# 重启容器
docker restart 容器ID
# 停止容器
docker stop 容器ID
# 强制停止容器
docker kill 容器ID
# 删除容器
docker rm -f 容器ID
# 查看容器日志
docker logs 容器ID
# 查看容器内运行的进程
docker top 容器ID
# 查看容器内部细节
docker inspect 容器ID
# 进入正在运行的容器并以命令行交互(退出: exit)
docker exec -it 容器ID /bin/bash
# 从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径 目的主机路径
# 导出容器为tar文件
docker export 容器ID > 文件名.tar
# 根据tar文件导入为镜像
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
# 提交容器为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 目标镜像名:[标签名]

三.Dockerfile

用来构建Docker镜像的文本文件,由一条条构建镜像所需的指令和参数构成的脚本;

每条指令都会创建一个新的镜像层并对镜像进行提交;

Docker执行Dockerfile的大致流程:

(1)docker从基础镜像运行一个容器

(2)执行一条指令并对容器作出修改

(3)执行类似docker commit的操作提交一个新的镜像层

(4)docker再基于刚提交的镜像运行一个新容器

(5)执行dockerfile中的下一条指令直到所有指令都执行完成

编写 Dockerfile 文件 ===> docker build 命令构建镜像 ===> docker run 依镜像运行容器实例;

Dockerfile文件内容:

shell 复制代码
# 基础镜像
FROM centos
# 镜像作者信息
MAINTAINER bao<zzyybs@126.com>
# 设置环境变量
ENV MYPATH /usr/local
# 创建容器后,终端默认登陆的进来工作目录
WORKDIR $MYPATH
# 容器构建时需要运行的命令(RUN是在 docker build时运行)
# 安装java8及lib库: RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
# 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
ADD jdk-8u361-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_361
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
# 当前容器对外暴露出的端口
EXPOSE 22122
# 指定容器启动后的要干的事情(Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换)
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash

构建命令:docker build -t 新镜像名字:TAG .

docker build -t centosjava8:1.5 .

通过Dockerfile启动 Java 服务

Dockerfile文件:

shell 复制代码
FROM java:8
MAINTAINER bao
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为zzyy_docker.jar
ADD demo-0.0.1-SNAPSHOT.jar /usr/local
ENTRYPOINT ["java","-jar","/usr/local/demo-0.0.1-SNAPSHOT.jar"]
#暴露9876端口作为微服务
EXPOSE 9876

构建镜像:docker build -t demo .

运行镜像:docker run -d -p:9999:9876 demo

访问微服务:124.70.13.135:9999

相关推荐
hopsky1 天前
Docker Desktop 报 500
运维·docker·容器
曦云沐1 天前
一键部署ROS2开发环境!Docker run命令详解与实战
docker·容器·ros2
H Journey1 天前
Docker swarm 集群搭建实战
运维·docker·容器
江湖有缘1 天前
Docker环境下使用RustScan端口扫描工具教程
运维·docker·容器
70asunflower1 天前
镜像仓库(Image Registries)详解
linux·docker·容器
青树寒鸦1 天前
wsl的docker备份redis和迁移
redis·docker·容器
岩屿1 天前
Ubuntu下安装Docker并部署.NET API(二)
运维·docker·容器·.net
hopsky1 天前
限制 Docker Desktop 的资源使用
运维·docker·容器
春日见1 天前
docker崩溃,闪退,与vscode断开连接
vscode·docker·容器
Suchadar1 天前
Docker搭建Web测试靶场
运维·docker·容器