Docker是什么
Docker是一个快速构建,运行,管理应用的工具
传统基于linux安装程序较为复杂繁琐,使用docker可以快速的进行项目部署和管理
镜像与容器
Docker进行安装应用时,会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包括应用所运行的环境,配置,系统函数库,Docker在运行景象时会创建一个隔离环境,称为容器(container)。
只要安装好了docker,docker的镜像能够忽略操作系统的差异直接进行部署运行,因为所有跟系统,环境相关的部分,docker镜像中都是包含的
不同的容器之间是相互隔离的,不会相互产生影响,也不会因为需求不同的环境出现问题
Docker的基本使用
docker run命令
docker run -d \ #
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=ctrl \
mysql
通过这样一个命令就能实现mysql的下载直接到运行
命令解读
docker run -d \ #
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=ctrl \
mysql
- docker run:创建并运行一个容器,-d让容器在后台运行
- --name : 为容器起名,必须唯一
- -p 3306:3306:设置端口映射 前者为宿主机端口,后者为容器内端口
- -e KEY=Value : 设置环境变量,具体参数可以查看镜像官方文档
- mysql : 指定运行的镜像名
-
- 镜像名一般由两部分组成:[repository]:[tag]
- repository为镜像名
- tag为镜像版本
- 如果不写名称,默认为最新版本
关于镜像和容器常用指令
docker save -o nginx.tar nginx
将镜像保存为其他文件
-o 想要得到的文件名 镜像名
docker load -i nginx.tar
将其他类型文件加载为镜像
-i 想要加载的文件名
docker rmi 镜像名
移除镜像
docker rm 容器名
移除容器
docker exec 容器名
进入容器
docker ps --format 格式参数
可以进行简化
查看容器
给常用Docker命令起别名,方便我们访问:
# 修改/root/.bashrc文件
vi /root/.bashrc
内容如下:
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
然后,执行命令使别名生效
source /root/.bashrc
数据卷
数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁
因为容器是对外隔离的,想要修改容器内文件需要进入到容器内部,但容器内的环境和函数库是精简到极致的,所以操作不方便。
使用数据卷与主机文件系统的目录进行映射,然后再使数据卷与容器内部的文件目录进行挂载
docker就实现了宿主机目录和容器内目录的双向绑定,在其中一侧所进行的操作都会在另一侧映射出来
通过数据卷作为媒介完成挂载
数据卷挂载,在执行docker run命令时,使用-v 数据卷:容器内目录 可以完成数据卷挂载
当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
如果创建容器时没有完成数据卷挂载,就无法再进行挂载了
基于本地目录直接挂载
容器的挂载还有第二种方式,即基于本地目录直接挂载
语法与数据卷挂载类似,区别在于-v参数之后不写数据卷,直接写本地目录即可
自定义镜像
日常开发中,不仅仅需要使用Docker官方提供的镜像,还有可能会用到docker官方没有提供的镜像,这个时候就需要我们自己自定义镜像了
重新介绍一遍,镜像就是包含了应用程序,程序运行的系统函数库,运行配置等文件的文件包。
构建镜像的过程其实就是把上述文件打包的过程。
镜像是分为很多层的,比如最底层的基础镜像,就是应用依赖的系统函数库,环境,配置,文件;最顶层的入口层,镜像运行入口,一般是程序启动的脚本和参数;中间添加安装包,依赖,配置等每次操作也会形成新的一层。
制作镜像就是将这些层分别压缩打包
你可以观察到,在从docker官方拉取镜像的时候,如果本地已经有了另一个镜像需要的基础镜像,会直接跳过这一层
DockerFile
DockerFile就是一个文本文件,其中包含指令,用于说明在构建镜像的过程中需要进行什么样的操作
以下为常见指令
FROM openjdk:11.0-jre-buster
COPY docker-demo.jar /app.jar
ENTRPOINT ["java","-jar","/app.jar"]
当编写好了DockerFile,可以用以下命令来构建镜像
docker build -t myImage:1.0 .
- -t: 是给镜像起名,格式依然是respository:tag的格式,不指定tag时,默认为latest
- . : 是指定Dockerfile所在目录,如果就在当前目录,则指定为“.”
网络
默认情况下,所有容器都是以bridge方式连接到docker的一个虚拟网桥上的
但是,这种情况下,随着容器的开启和关闭,容器被分配到的ip也是变化的,如果想让不同容器通过ip进行通信不太可行,需要用到自定义网络
docker compose
在日常开发中,我们在进行项目部署的时候,基本上都会同时用多个docker容器,比如比较经典的数据库+nginx+项目本体,而一个一个手动部署,启动过于繁琐,所以我们需要用到docker compose
使用docker 查看镜像无权限问题
报错:
[yichen@bogon ~]$ docker images
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/json": dial unix /var/run/docker.sock: connect: permission denied
解决命令:
sudo chown root:docker /var/run/docker.sock # 修改docker.sock权限为root:docker
sudo groupadd docker # 添加docker用户组
sudo gpasswd -a $USER docker # 将当前用户添加至docker用户组
newgrp docker