-
镜像(image)
docker镜像就好比一个模板,可以通过这个模板来创建容器服务,通过这个镜像可以创建多个容器,最终服务或项目运行在这些容器中
-
容器(container)
docker利用容器技术,独立运行一个或者一组运用,容器通过镜像来创建
-
仓库(repository)
仓库就是存放镜像的地方,可以分为公有仓库和私有仓库,常见公有:
Docker Hub、阿里云、华为云都有容器服务器
一、安装Docker
参照官网进行安装Docker Desktop
macOS下安装成功查看版本信息
二、Docker常用命令
- 基本命令
#版本信息
docker version
#详细信息
docker info
#命令帮助
docker [command] --help
复制代码
- 镜像相关
#搜索镜像
docker search xxxx
#拉取镜像
docker pull mysql[:版本号]
#查看镜像:-a-->查看全部;-q-->只查看id
docker images [-a/-q]
#删除指定镜像
docker rmi -f 镜像id
#删除多个镜像
docker rmi -f 镜像id 镜像id
#删除全部镜像
docker rmi -f $(docker images -aq)
复制代码
- 容器相关
docker run [] image
#参数说明
--name="Name"
-d #后台方式运行,如果使用后台运行,必须要有一个前台进程,如果没有的话容器会自动停止
-it #使用交互方式运行,进入容器查看内容
-p #指定容器的端口 -p 8080:8080
-p 主机端口:容器端口 #最常用
-p 容器端口
容器端口
-p ip:主机端口:容器端口
-P #随机指定端口
exit #从容器停止并退出
Ctrl + p + q #容器不停止退出
docker exec -it 容器id /bin/bash
复制代码
#查看容器
docker ps 命令
#没有接命令,表示当前运行的容器
-a #列出当前正在运行的,带出历时运行过的
-n=? #显示最近创建的容器,如 -n=1表示最近1个
-q #只显示容器的编号
#查看容器(镜像)详细信息
docker inspect [options] name|id
-f
-s
复制代码
#启动和停止容器
docker start 容器id #启动
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
#移除容器
docker rm 容器id #如果容器正在运行,无法移除容器
docker rm -f 容器id #强制移除容器
#日志
docker logs
#查看进程
docker top 容器id
复制代码
#进入容器后开启一个新的终端,可以在里面操作(常用)
docker exec -it 容器id
#进入容器正在执行的终端,不会启动新进程
docker attach 容器id
复制代码
#从容器中拷贝文件到主机
docker cp 容器id:路径 主机路径
复制代码
三、Docker镜像
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件
所有应用直接打包docker就可以跑起来
pull远程仓库、朋友拷贝、自己制作
1. docker镜像加载原理
-
UnionFs(联合文件系统)
分层、轻量级,基于叠加
-
docker镜像加载
-
实际上由一层一层的文件系统(UnionFs)组成
-
bootfs:BootLoader + kernel,BootLoader主要是引导kernel
-
rootfs:bootfs之上,
-
2. commit 镜像
镜像是无法修改的,当运行一个镜像后,会产生一个容器,修改只在容器层上生效,当commit容器后会生成一个新的镜像,作为以后备用,以此类推,以后不断叠加,产生出新的镜像。就像虚拟机中的快照一样。
#将当前容器提交为镜像
docker commit -m="message" -a="author" 容器id 镜像名:[tag]
复制代码
四、容器数据卷
容器数据卷:容器中数据的持久化和同步操作,容器间的数据也是可以共享的
docker run -it -v 主机目录:容器内目录 镜像 /bin/bash 复制代码
可以使用多个
-v
实战:安装mysql
# -p 端口映射
# -v 卷挂载
# -e 环境配置
# --name 容器名
docker run -d -p 3310:3306 -v ~/home/mysql/conf:/etc/mysql/conf.d -v ~/home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
复制代码
使用Navicat连接docker容器中数据库是发生错误
问题的发生原因:mysql8之前版本的加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password
解决方案:①升级Navicat驱动;②将加密规则还原为mysql_native_password(下面采用这种方案)
#进入容器 docker exec -it 容器id bash #登录mysql mysql --user=root --password #修改加密规则 alter user 'root' identified with mysql_native_password by '123456'; 复制代码
在Navicat中创建一个数据库后,查看主机挂载路径下已经生成了对应的文件
具名和匿名挂载
#匿名挂载 -v后直接跟容器路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
#具名挂载 -v后加卷名:容器路径
docker run -d -P --name nginx01 -v hasNameNginx:/etc/nginx nginx
#查看卷的相关信息
docker volume command
create #创建一个卷
inspect #查看详情 (跟卷名)
ls #列出所有的卷
prune #移除不用的卷
rm #移除一个或多个卷
复制代码
所有docker容器内的卷,没有指定目录的情况下,都是在
/var/lib/docker/volumes/
路径下通常我们使用的是具名挂载
(指定路径挂载前面 已经讲过,即
-v
后面加宿主机路径:容器路径
)
还可以通过-v容器内路径:ro/rw来改变读写权限
# :ro表示这个路径只能通过宿主机来更改,容器内部是无法操作的
docker run -d -P --name nginx01 -v hasNameNginx:/etc/nginx:ro nginx
# :rw表示可读可写
docker run -d -P --name nginx01 -v hasNameNginx:/etc/nginx:rw nginx
复制代码
五、DockerFile
dockerfile是用来构建docker镜像的文件,本质就是一个命令参数脚本
- 编写一个
dockerfile
文件docker build
构建成为一个镜像docker run
运行镜像docker push
发布镜像
DockerFile构建过程:
-
基础知识
- 每个关键字(指令)必须是大写
- 执行从上到下顺序执行
#
表示注释- 每一个指令都会创建提交一个新的镜像层
dockerfile是面向开发的,我们以后要发布项目,做镜像就需要编写dockerfile文件,这个文件十分简单
docker镜像逐渐成为企业交付的标准,必须掌握!
步骤:开发、部署、运维….
-
DockerFile:构建文件,定义了一切的步骤
-
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品
-
Docker容器:容器就是镜像运行起来提供服务器
FROM #指定基础镜像
MAINTAINER #镜像是谁写的,一般是加上姓名和邮箱
RUN #docker镜像构建的时候需要运行的命令
ADD #往镜像中添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录位置
EXPOSE #保留端口配置
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD #当构建一个被继承dockerfile这个时候就会运行ONBUILD指令
COPY #类似add,将我们的文件拷贝到镜像中
ENV #构建的时候设置环境变量
复制代码
DockerHub中99%的镜像从scratch这个基础镜像开始构建,然后配置需要的软件和相关配置
创建一个自己的centos
#构建镜像 docker build -f dockerfile文件路径 -t 镜像名:[tag] 复制代码
构建完毕后,我们创建的centos就可以使用vim或net相关的命令了
可以使用
docker history name|id
查看一个镜像的构建过程
对比
CMD
和ENTRYPOINT
- CMD:覆盖
- ENTRYPOINT:追加