Docker基础使用
Docker就是(程序+环境)包,解包到容器相互不影响。
docker官方以及大量的第三方制作了带各种程序的操作系统,装在名为image的文件中,存放在镜像仓库docker hub仓库。我们只需要输入命令找到这些image文件,然后创建一个容器实例化,那么已经配置好的程序就可以直接运行了。
这样节省了我们大量的部署配置运维的时间。解决了微服务的部署难题。
简单实战docker部署一个mysql
先给linux下载docker
【Docker】在 Ubuntu 上安装 Docker 的详细指南_ubuntu安装docker-CSDN博客
(使用ubuntu linux)
删除原有的docker
apt remove docker
下载依赖
apt install apt-utils
apt install gnome-terminal
sudo apt install apt-transport-https ca-certificates curl software-properties-common
配置apt 国内源
根据下面的文章直接配置国内镜像源。
Ubuntu apt-get 国内镜像源替换(新手必看,超详细!各种镜像源网站都有)_apt 国内镜像-CSDN博客
配置docker的GPG秘钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt update
apt install docker-ce docker-ce-cli containerd.io
测试dokcer
docker -v
docker images
为了解析docker命令,需要启动docker守护进行服务。
ubuntu使用service命令启动服务,service 服务名 stop或者start或者restart
service docker start
配置docker的镜像加速
docker的镜像仓库在国外,那么docker需要配置镜像来加速下载的速度。
{
"registry-mirrors": [
"https://docker.linkedbus.com",
"https://docker.xuanyuan.me"
]
}
Docker/DockerHub国内镜像源/加速列表(11月26日更新-长期维护)-CSDN博客
使用docker部署mysql
直接使用命令(\转义换行,使得单行命令可以多行输入)
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql
如果想要使用已经有的images,通过docker images查看imagesID,使用下面的变量来创建实例。
docker run -e 环境变量 imagesID
例如:
docker run -e MYSQL_ROOT_PASSWORD=123456 5c62
5c62是具体的imageID。
注意:-p 的作用是将docker容器中的端口映射到宿主机的端口上,如果没有设置会导致外部无法连接。
这样在外部就可以连接到mysql实例了。
docker的基本机制
如果在上面使用docker安装mysql的时候遇到了问题,那么你一定会总结出如下的内容,没错这些内容都是在我安装mysql时出错,一点一点搜多理解出来的。
docker分为images镜像,container实例容器。(docker从docker官方维护的镜像仓库中下载image)
每个images是一个配好的程序,我们可以启动image从而得到一个实例,这个实例被叫做container,每个image可以有好多个实例,也就是好多个container。
通过docker run imageID 我们就可以得到container了。
通过docker ps -a 我们就可以看到所有的container了。没错ps还是那个ps,container分为正在运行的container和停止运行的container。
通过docker rm containerID来删除container,通过docker rmi imageID来删除image。
我们删除的时候需要将所有使用到images的container删除完毕才能删除image,否则可以使用级联强制删除images这样自动将所有用到image的container全删除了。
container容器实例
之所以叫做容器,是因为container是一个环境,包含了我们想要的程序。我们也可以进入容器。
进入容器内部:
docker exec -it containerID /bin/bash
可以知道exec是关键,表示进入容器重新运行一个什么什么。
-it选项是分别表示-t新的终端terminal以及-i允许与标准输入进行交互input
docker命令解析
docker run 创建并运行一个实例(容器)
众多选项解释:
--name 【xxx】 给容器起一个name(可以代替冗长的id)
-d 表示daemon让容器在后台运行不占用当前终端。
-p 【宿主机端口:容器端口】端口映射,将容器端口映射到宿主机端口上
-e 【key】=【value】是environment环境的缩写,环境变量。给容器内的实例读取的。可以从docker hub中查看镜像需要读取的环境变量。
[repository]:[tag]最后给镜像的名字,完整的写法就是镜像名:版本,如果没写版本就默认是最新版本。
docker常见命令
docker主线命令就是操作images和container的命令。我们根据这个流程,来熟悉一下docker的命令。
镜像操作
1 从镜像仓库中下载镜像到本地
docker pull,有点像git是吧,那么推送到镜像仓库自然而然就是docker push
2 查看本地镜像
docker images
3 删除镜像
docker rmi
构建自己的image
根据dockerFile文件,使用docker build来构建image
4 打包发送镜像
docker save 变成压缩包
5 压缩包加载到本地
docker load
容器操作
1 下载镜像创建并运行容器
docker run
2 操作容器(中的程序)运行状态
docker stop/start/restart 【containerID】
3 查看众多的容器状态
docker ps ,常用的有docker ps -a ,可以查看所有运行或者停止运行的容器,-all嘛。
为了简化输出信息,可以使用
docker ps --format "table {{.ID}}\t{{.Image }}\t{{ .Ports}}\t{{.Status}}\t{{.Names}}"
但是这串命令太长了,我们可以是使用linux的命令别名机制,来为这串命令起别名。
参见Linux不该忘记的知识-CSDN博客
4 删除容器实例
docker rm 【containerID】
5 查看容器运行的日志
docker logs
6 进入容器执行命令
docker exec ,常用的是docker exec -ti 创建新的终端并允许交互
docker权限和安全
Docker真的需要root用户才能启动吗?揭秘非root权限运行Docker的秘诀! - 云原生实践
docker数据卷
某些镜像,我们需要修改容器内的数据。但是镜像通常只包括程序运行的基础环境。所以在容器内进行其他操作都是比较困难的。
所以出现了数据卷volume,实际上是将docker容器文件存储到了宿主机上。
还有一种是将容器数据存储在宿主机的内存中。
例如nginx容器
docker部署nginx服务器,并修改静态网页,保持可以访问。
docker run -d --name nginx -p 80:80 nginx
通过docker官网中对于nginx镜像的介绍,我们知道nginx镜像中配置静态网页的路径是/usr/share/nginx/html,nginx的配置文件在/etc/nginx/conf
映射规则
为了保证文件不冲突,宿主机上统一会把数据卷映射到/var/lib/docker/volumes/同名目录下。
(也可以指定目录,使用目录路径替代原数据卷的位置即可)
数据卷命令
创建docker volume create
指在当前宿主机上/var/lib/docker/volumes目录下创建一个数据卷,受到docker管理。下面的命令都是操作宿主机上的数据卷。
需要绑定操作才能将宿主机上的数据卷绑定到相应容器。
这个操作一般是通过docker run -v参数来实现
查看docker volume ls
删除docker volume rm
查看详细内容docker volume inspect
清除数据卷docker volume prune
docker volume --help实时查看帮助信息
要想让宿主机上的数据卷真正和docker容器中的目录建立联系,需要使用docker run -v
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
html表示数据卷名字,后面的路径是容器中的对应目录的路径。
这样名为html的数据卷就和nginx容器里的/usr/share/nginx/html目录绑定上了。
(如果数据卷不存在会自动在/var/lib/docker/volumes/下创建同名目录)
绑定之后通过docker volume inspect命令查看数据卷的信息。
可以看到html数据卷的详细信息。
查看容器挂载的数据卷
docker inspect containerID或者name 查看容器详情。
命令的结果是一段json格式的输出,可以在Mounts属性下看到数据卷信息
匿名卷
在创建容器时自动创建的数据卷volume叫做匿名卷,是镜像中设定好的。
实际上是因为容器不再存在时,数据不会持续存在,并且如果另一个进程需要数据,则可能很难将数据从容器中取出。容器的可写层与运行容器的主机紧密耦合。您无法轻松地将数据移动到其他地方。
所以一些数据我们需要,创建数据卷将数据保存在宿主机上。
匿名卷的数据卷名称通常比较长,我们可以在docker run -v显式绑定数据卷,覆盖原本的匿名卷。
覆盖之后,只要挂载到相同的地方,那么docker容器升级,或者删除了再部署,数据都会长久保存下来,还可以兼容使用。
dockerfile自定义镜像
我们自己开发的应用,也需要制作成镜像,来方便运维部署。
配置镜像就是配置程序运行所需要的每一层环境。
例如需要的linux系统,需要的jre环境,需要的jar包,需要的运行脚本。
docker将他们分为不同的层次,Layer。每层都有安装包依赖,配置等。
分层方便与修改,重组。所以有了一个概念BaseImage,基础镜像,通常就是系统函数库,环境配置,文件等等。众多的镜像都共用基础镜像,提速构建的过程。
在docker下载的时候也会检查镜像的层次,如果本地有镜像和要下载的镜像的基础镜像相同,那么就可以节省重复内容的下载时间,直接跳过开始下载镜像后面几层的内容。
dockerfile描述镜像结构
需要让docker帮助我们构建镜像。dockerfile就是我们描述镜像结构的工具。
dockerfile中主线指令如下:
from 指定基础镜像 例如 from centos:7.6
evn 设置容器中环境变量,也可后面指令中引用使用。env key=value
copy 将本地文件拷贝到镜像中的指定目录 copy /export/server/jdk.tar.gz /tmp
run 让docker 容器执行命令 run tar -zxvf /tmp/jdk.tar.gz -C /export/server/ && EXPORTS path=/export/server/jdk:$path
expose 描述程序监听的端口,方便镜像使用者做端口映射 expose 8080
entrypoint 镜像中的启动命令,当容器启动的时候会调用这一条entrypoint ['java', '-jar' ,'xx.jar']
详细参考docker官方文档
构建镜像
写好dockerfile之后,使用docker build命令让docker构建镜像。
docker build -t 名字:版本 /dockerfile所在目录(-t就是tag版本的意思,如果不设置版本默认是latest)
意思就是构建 版本为的镜像 根据 指定目录中的dockerfile
为什么指定的是dockerfile所在目录,是因为docker在解析和执行dockerfile中的命令时,dockerfile中会有一些copy等命令,这些命令所需要的资源文件往往放在dockerfile同目录下,所以直接指定目录是docker build的用法。
docker网络
docker中的所有容器都要自己的网络,通过docker inspect可以看到,这些容器都在同一个子网中。
docker有一个自己的虚拟网桥,docker启动的容器就桥接接在这个虚拟网桥上。
现在有的需求就是,要把某些容器的ip固定下来。
docker提供了建立docker局域网的操作。docker将容器名和容器的ip进行绑定,这样可以使用容器名来代替ip,那么无论ip如何动态分配都可以使用容器名来访问到容器。
docker network create
docker network ls,rm,prune,connect,disconnect,inspect这些命令都可以通过命令的字面意思进行理解。
可以在docker run 中直接指定network信息,这样容器就不会加入默认网桥中。
docker run --network networkname
容器只有在同一个子网中才能相互找到,ping