docker

docker基础

什么是docker

docker可以帮助我们下载应用镜像,创建并运行镜像的容器,从而快速部署应用;

什么是镜像

将应用所需的系统函数库、依赖、配置等与应用一起打包得到的就是镜像

什么是容器

为每个镜像的应用进程创建的隔离运行环境就是容器;

什么是镜像仓库

存储和管理的镜像的服务就是镜像仓库
DockerHub是目前最大的镜像仓库,其中包含各种常见的应用镜像;

docker的工作流程

当我们利用docker安装应用时,docker会自动搜索并下载应用镜像(images),镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。docker会在运行镜像时创建一个隔离环境,称为容器;
在这里插入图片描述

docker常用命令

docker run -d \    -d 让容器在后台运行
> --name mysql \   容器起个名字
> -p 3306:3306 \   宿主机和容器中的应用端口映射
> -e TZ=Asia/Shanghai \  -e 设置镜像的环境变量
> -e MYSQL_ROOT_PASSWORD=123456 \
> mysql 指定运行的镜像名字(镜像就是应用加环境加配置)

镜像名称由两部分组成:镜像名:版本
如:nginx:latest(latest可以不写)

docker pull nginx 下载镜像
docker rmi nginx 删除镜像
docker images 查看所有镜像
docker ps 查看运行中的容器
docker ps -a 查看所有的容器
docker start nginx(nginx是容器名) 启动容器中的应用
docker stop nginx 停止容器中的应用
docker rm nginx : 删除容器
docker exec -it nginx bash:以命令行方式进入容器内部
docker exec -it mysql mysql -uroot -p 直接进入容器并操作镜像中的应用
docker inspect nginx:查看容器详细信息
docker save
docker save -o nginx.tar nginx:latest:将docker存储到二进制文件
docker load -i nginx.tar :加载镜像文件
docker logs <容器ID或名称> | grep “error” :查看容器日志

在这里插入图片描述

数据卷

数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁
在这里插入图片描述

数据卷使用

docker run -d \    
> --name mysql \   
> -p 3306:3306 \   
> -e TZ=Asia/Shanghai \  
> -e MYSQL_ROOT_PASSWORD=123456 \
> -- network test 
> -v mysql:/var/lib/mysql 创建数据卷名为mysql,宿主机创建数据卷对应的目录,与容器进行绑定
> 或者-v /user/mysql:/var/lib/mysql 直接将宿主机的/user/mysql 与容器目录绑定
> mysql 

----------------------数据卷情况说明--------------------
-v mysql:/var/lib/mysql
数据卷名为mysql
宿主机会创建 /var/lib/docker/volumes/mysql/_data
宿主机-data目录的内容会与容器中/var/lib/mysql目录(应用的配置目录或者数据目录)双向绑定同步;
--------------------数据卷情况说明----------------------------------

数据卷常用命令

docker volume ls: 查看数据卷
docker volume rm 数据卷名称:删除数据卷
docker volume inspect 数据卷名称 : 查看数据卷详情
docker volume prune: 删除未使用的数据卷

自定义镜像

镜像就是包含了应用程序、程序运行的操作系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。
以java应用为例,java应用的镜像就是把操作系统函数库、jre、环境变量配置、jar包、运行脚本分层次打成一个个文件包,就组成了java应用的镜像;
在这里插入图片描述

基本原理

在这里插入图片描述
当然,有些应用的基础镜像是相同的,基础镜像可以共享复用,所以我们在自定义镜像时只负责打包上面的layer和入口即可;
同时,构建镜像的过程也不需要我们自己将每层打包,只需写一个dockerfile即可,docker会自动帮助我们完成镜像的制作;

DockerFile

DockerFile是一个文本文件,其中包含一个个的指令,用指令来说明要执行什么操作来构建镜像,
docker读取dockerfile文件,帮助我们构建镜像;常见指令如下:
在这里插入图片描述
还是以制作java应用的镜像为例,看下dockerFile长什么样子;

# 指定基础镜像
FROM ubuntu:16.04
# 配置容器中(基础操作系统基础镜像)环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包,准确说将宿主机的jdk拷贝到docker容器中的目录中
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 安装JDK    在容器中执行shell脚本
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
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

我们可以基于Ubuntu基础镜像,利用Dockerfile描述镜像结构,也可以直接基于JDK为基础镜像,省略前面的步骤:

在这里插入图片描述

构建自定义镜像

定义完dockerfile后,我们执行

docker build -t 镜像名(program:1.0) Dockerfile目录

来完成镜像的构建

网络

默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上:
在这里插入图片描述
但是存在一个问题,容器中的ip地址是根据默认网桥(docker网卡)随机分配的,比如,当我们java程序指定数据库ip地址连接数据库,当中途数据库容器stop,再start后,ip地址发生变化,java应用就会出现连不上数据库的问题;
此时,解决的办法就是我们自定义网络,自己创建个新的网桥,并指定多个容器连接到新的网桥上,这样,我们可以通过容器名来访问其他容器的应用,不需要ip地址,就算是容器的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 mysql \   
> -p 3306:3306 \   
> -e TZ=Asia/Shanghai \  
> -e MYSQL_ROOT_PASSWORD=123456 \
> -- network test  当前容器加入test网桥(网络)
> -v mysql:/var/lib/mysql 创建数据卷名为mysql,宿主机创建数据卷对应的目录,与容器进行绑定
> 或者-v /user/mysql:/var/lib/mysql 直接将宿主机的/user/mysql 与容器目录绑定
> mysql 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值