目录
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