一个小栗子:
docker pull ubuntu:载入Ubuntu镜像
docker run ubuntu:启动容器,-d:启动后进入后台
docker ps -a:查看所有容器
docker start xxx:启动一个已停止的容器
docker stop xxx:停止容器
docker restart xxx:重启容器
参考:https://blog.csdn.net/m0_49960764/article/details/124292208
Docker是一个开源的应用容器引擎,让开发者可以将他们的应用以及依赖包打包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,可以实现虚拟化,容器是a完全使用沙箱机制,对峙之间不会有任何接口。
Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。Docker容器通过Docker镜像来创建。容器与镜像的关系类似于对象编程中的对象与类。
官网:https://docs.docker.com/
官方文档:https://docs.docker.com/desktop/
官方API:https://docs.docker.com/reference/
一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。
卸载旧版本:yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
下载依赖安装包:yum install -y yum-utils
配置镜像仓库:
i. 使用国外的地址:yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
ii. 使用阿里云的Docker镜像仓库:yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum软件包:yum makecache fast
下载docker:
i. 安装社区版:yum install docker-ce docker-ce-cli containerd.io
ii. 安装企业版:yum install docker-ee docker-ee-cli containerd.io
启动docker:
systemctl start docker # 启动Docker
docker version # 查看当前版本号,是否启动成功
systemctl enable docker # 设置开机自启动
docker的HelloWord:docker run hello-world
,初次使用,本地是没有HelloWord的容器的,会从远程镜像仓库pull一个最新的下来,远程仓库是有HelloWord的
卸载docker:
yum remove docker-ce docker-ce-cli containerd.io # 卸载依赖
rm -rf /var/lib/docker # 删除资源,注意:./var/lib/docker是docker的默认工作路径
容器[containers]:
i. 容器的新增:
docker create -it --name 容器名称 镜像名称 /bin/bash
# -i:交互式命令行,-t:将虚拟环境的交互式绑定到一个终端上docker run -dit --name 容器名称 镜像名称 /bin/bash
# -d:守护容器,即使退出终端,容器仍然运行ii. 容器的修改:
3. docker container ls --all
,查看所有的容器
4. docker container stop xxx
,停止指定的容器
5. docker container rm xxx
,删除指定停止的容器
6. docker container kill xxx
,杀死一个正在运行的容器(停止)
7. docker container start xxx
,开启一个停止的容器
iii. 容器的查询:
docker ps -a
,查询容器镜像[image]:
i. 镜像的新增:
docker pull xxx
,从远程仓库拉取指定镜像docker run xxx
,从远程仓库拉取指定镜像,并运行容器docker load -i ${filePath}
,从本地tar文件加载镜像,-i:读取一个tar文件,取代标准输入docker commit xxx
,制作镜像,从容器创建一个新的镜像
ii. 镜像的删除:
docker rmi 镜像id
,删除镜像
iii. 镜像的修改:
docker tag ${old_tag} ${new_tag}
,修改镜像的tag标签
docker push docker账号id/镜像名称[:tag标签]
,上传镜像到docker公共仓库中 —— Dockerhub
docker push ip:端口/镜像名称[:tag标签]
,上传镜像到docker私有仓库,
eg:docker push localhost:5001/image-registry:v1
远程仓库[registry]:
i. Dockerhub:docker公共仓库,需注册
ii. 部署本地私有仓库:
/etc/sysconfig/docker
不信任注册,需要加端口;/etc/docker/daemon.json
添加源;管理镜像常用命令:
ls # 列出镜像
build # 使用Dockerfile创建镜像
history # 查看镜像历史
inspect # 显示一个或多个镜像的详细信息
pull # 从镜像仓库拉去镜像
push # 推送镜像到镜像仓库
rm # 移除一个或多个镜像
prune # 移除未使用的镜像【没有被标记或者被任何容器引用的】
tag # 创建一个引用源镜像标记的目的镜像
export # 导出容器文件系统到tar归档文件
import # 导入tar归档文件来创建镜像
save # 保存一个或多个镜像到一个tar归档文件
load # 加载镜像(从tar归档文件或标准输入)
创建容器常用选项:
-i, -iteractive # 交互式
-t, -tty # 分配一个伪终端
-d, detach # 运行容器到后台
-e, -env # 设置环境变量
-p, -publish list # 发布容器端口到主机
-P, -publish-all # 发布容器所有EXPOSE的端口到宿主机随机端口
-name string # 指定容器名称
-h, -hostname # 设置容器主机名
-ip string # 指定容器ip,只能用于自定义网络
-network # 连接容器到一个网络
-mount mount # 将文件系统挂载到容器
-v, -volume list # 绑定挂载一个卷
-restart string # 容器退出时重启策略,默认为no,可选值:always | on-failure
容器限制常用选项:
-m, -memory # 容器可以使用的最大内存
-memory-swap # 允许交换到磁盘的内存量
-memory-swappiness=<0~100> # 容器使用swap分区交换的百分比,0~100,默认-1
-oom-kill-disable # 禁用OOM Killer
--cpus # 可以使用的CPU数量
-cpuset-cpus # 限制容器使用特定的CPU核
-cpu-shares # CPU共享(相对权重)
attach # 将本地标准输入、输出和错误流附加到正在运行的容器
build # 使用Dockerfile创建镜像
commit # commit容器,根据容器的更改创建一个新的镜像,可以添加提交信息
cp # 在容器和本地文件系统之间复制文件
create # 创建容器
diff # 检查容器文件系统中文件或目录的更改
events # 从服务器获取实时事件
exec # 在运行的容器中执行命令
export # 将容器的文件系统导出为tar存档
history # 显示镜像的历史记录
images # 列出镜像
import # 从tarball导入内容以创建文件系统镜像
info # 显示docker应用的信息
inspect # 显示有关docker镜像的信息
kill # 强制停止服务容器
load # 从tar存档文件或stdin加载镜像
login # 登录docker中央仓库
logout # 退出docker中央仓库
logs # 获取容器的日志
pause # 暂停一个或多个容器中的进程
port # 列出端口映射或容器的指定映射
ps # 显示容器
pull # 从docker中央仓库拉取镜像
push # 将镜像推送到docker中央仓库
rename # 容器重命名
restart # 重启容器
rm # 删除一个或多个容器
rmi # 删除一个或多个镜像
run # 创建一个新的容器并运行一条命令
save # 将一个或多个镜像保存到tar存档(默认情况下流式传输到stdout)
search # 在Dockerhub中搜索镜像
start # 启动停止的容器
stats # 以实时信息流的方式显示容器资源使用情况统计的信息
stop # 停止容器
tag # 给target_image创建一个引用source_image的标记
top # 显示容器的运行进程
unpause # 取消暂停容器中的进程
update # 更新容器的配置
wait # 阻止一个或多个容器直到容器停止,然后打印退出代码
docker images
,查看本地主机的所有镜像。参数:-a/--all
列出所有镜像,-q/--quiet
只显示镜像的id
docker search
,搜索镜像。参数:-f/--filter filter、--format string、--limit int、--no-trunc
eg:
docker search mysql --filter STARS>300
,搜索收藏数大于300的mysql镜像
docker pull 镜像名[:tag]
,下载镜像。
eg:
docker pull mysql:5.7
docker rmi
,删除镜像。
eg:
docker rmi -f image_id1 image_id2 image_id2
docker run [可选参数] image [command] [arg...]
,创建一个新的容器并运行一个命令
可选参数:
-a
,指定标准输入输出内容类型,可选值:stdin、stdout、stderr
--name="xxx"
,指定容器名称
-d
,后台方式运行容器
-it
,使用交互方式运行,进入容器查看内容
-p ip:主机端口:容器端口
,配置主机端口映射到容器端口
-p 主机端口:容器端口
-p 容器端口
, 指定容器的端口
-P
,随机指定端口
docker run -it [容器id] /bin/bash
,进入容器
exit
,退出容器
docker ps
,列出当前正在运行的容器
可选参数:
-a
,列出所有容器的运行记录
-n=?
,显示最近创建的n个容器,默认-1
-q
,只显示容器的编号
-s
,显示总文件大小
docker rm 容器id
,删除指定的容器【注意:不能删除正在运行的容器】
可选参数:
-f
,强制删除,包括正在运行的容器
-l
,删除容器间的网络连接,而非容器本身
-v
,删除与容器关联的卷
eg,删除所有的容器:
docker rm -f $(docker ps -aq)
docker ps -a -q | xargs docker rm
docker start 容器id
,启动容器
docker restart 容器id
,重启容器
docker stop 容器id
,停止当前运行的容器
docker kill 容器id
,强制停止当前容器
docker run -d 镜像名
,后台启动容器
docker logs [OPTIONS] 容器id
,查看日志
Options:
-f
,跟踪日志输出,实时查看日志,类似tail -f
--since
,开始时间,查看从这个时间开始的所有日志
-t
,显示时间戳
-n
,仅列出最新n条容器日志,默认全部
常用:
docker logs -tf 容器id
,查看实时日志,显示时间戳
docker logs --tail NUM 容器id
,查看容器的最后NUM行日志
docker logs -n NUM 容器id
,查看最新的NUM条日志
eg:
docker logs -tf --tail 10 容器id
,实时查看容器的最后10行日志,并显示时间戳
docker top 容器id
,查看容器中的进程信息
docker inspect [OPTIONS] name|id [name|id ...]
,查看镜像/容器的元数据
Options:
-f
,指定返回值的模板文件
-s
,显示总的文件大小
--type
,为指定类型返回json
docker exec -it 容器id /bin/bash
,进入当前正在运行的容器。【注意:进入容器后开启一个新的终端,可以在里面操作】
docker attach 容器id
,同样是进入当前正在运行的容器。【注意:进入容器正在执行的终端,不会启动新的进程】
docker cp 容器id:容器内路径 目的主机路径
,copy容器的文件到主机中
docker cp 主机文件路径 容器id:容器内目的路径
,copy主机的文件到容器中
eg:
docker cp 32a6:/home/bin/test.sh /root/cust/
docker inspect redis镜像的ID
命令查看镜像的元信息,找到layer信息,可以看到镜像的分层。为了实现数据持久化,使容器之间可以共享数据。可以将容器内的目录,挂载到宿主机上或其他容器内,实现同步和共享的操作。即使将容器删除,挂载到本地的数据卷也不会丢失。
直接使用-v
命令来挂载:docker run -it -v 主机目录:容器内目录
eg:
docker run -it -v /home/test:/home centos /bin/bash
,此时修改主机/home/test/
目录下的文件,容器中/home/目录下文件会同步修改。
具名和匿名挂载:
i. 匿名挂载:docker run -v 容器内路径
,在 -v 只写了容器内的路径,没有写容器外的路径。
eg:
docker run -d -P --name nginx01 -v /etc/nginx nginx
,-P 随机指定端口
ii. 具名挂载:docker run -v 卷名:容器内路径
,
eg:
docker run -d -P --name nginx02 -v volume_nginx:/etc/nginx nginx
iii. 查看卷名:docker volume ls
iv. 查看卷信息:docker volume inspect 卷名
**注意:**所有docker容器内的卷,没有指定目录的情况下都是
在/var/lib/docker/volumes/卷名/_date
[宿主机的该目录下??]
v. 匿名挂载、具名挂载、指定路径挂载的区分:
-v 容器内路径
,匿名挂载-v 卷名:容器内路径
,具名挂载-v 宿主机路径:容器内路径
,指定路径挂载
vi. 容器间的数据同步/同步挂载:docker run -it --name docker02 --volumes-from docker01 镜像名
docker01:数据卷容器
docker02:创建出的新容器
- -volumes-from:同步挂载参数
docker01 创建的数据会同步到 docker02 上!!两个容器的数据同步,意味着现在 docker02 创建的数据也会同步在 docker01 上。
vii. 容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器为止!但如果持久化到了本地,那么此时,本地的数据是不会被删除的!
Dockerfile用来构建docker镜像的构建稳健,也就是命令脚本。
构建步骤:
i. 构建一个dockerfile文件;
ii. docker build 构建成为一个镜像;
iii. docker run 运行镜像;
iv. docker push 发布镜像,到DockerHub、阿里云镜像仓库等。
使用dockerfile构建镜像:docker build -f filename -t 镜像名:tag
eg:
docker build -f dockerfile01 -t ldq/centos:1.0
列出当前镜像:docker images
DockerFile构建过程:
i. 每个保留关键字(指令)都必须是大写字母;
ii. 执行顺序从上到下;
iii. #表示注释;
iv. 每一个指令都会创建一个新的镜像层,并提交。
DockerFile关键字:
FROM | 指定父镜像 | 指定dockerfile基于哪个image构建
关键字 | 作用 | 备注 |
---|---|---|
FROM | 指定父镜像 | 指定dockerfile基于哪个image构建 |
MAINTAINER | 作者信息 | 用来标明这个dockerfile的作者 |
LABEL | 标签 | 用来标明dockerfile的标签。可以使用label代替maintainer,最终都是在docker image基本信息中可以查看 |
RUN | 执行命令 | 执行一段命令,默认是/bin/sh。格式:RUN command,或者:RUN [“command”, “param1”, “param2”] |
CMD | 容器启动命令 | 提供启动容器时的默认命令,和ENTRYPOINT配合使用。格式:CMD command param1 param2,或者:CMD [“command”, “param1”, “param2”]——【指定容器启动的时候要运行的命令,只有最后一个会生效,可被替代】 |
ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用——【指定容器启动的时候要运行的命令,可以追加命令】 |
COPY | 复制文件 | build的时候复制文件到image中 |
ADD | 添加文件 | build的时候添加文件到image中。不局限于当前build上下文,可以来源于远程服务 |
ENV | 环境变量 | 指定build时的环境变量,可以在启动容器的时候通过-e覆盖。格式:ENV name=value |
ARG | 构建参数 | 只在构建的时候使用的参数,如果有env,则同名的arg参数会被env覆盖掉 |
VOLUME | 定义外部可以挂载的数据卷 | 指定build的image哪些目录可以在启动的时候挂载到文件系统中。启动容器的时候用-v绑定。格式:VOLUME [“目录”] |
EXPOSE | 暴露端口 | 定义容器运行时监听的端口。启动容器时使用-p来绑定暴露端口。格式:EXPOSE 8080,或者:EXPOSE 8080/udp |
WORKDIR | 工作目录 | 指定容器内部的工作目录。如果没有创建则自动创建,如果指定/开头,使用的是绝对路径,如果不是/开头,那么是在上一条WorkDir路径的相对路径 |
USER | 指定执行用户 | 指定build或者启动时候的执行用户,在run、cmd、entrypoint执行的时候的用户 |
HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测命令。基本没用,因为很多时候应用本身有健康监测机制 |
ONBUILD | 触发器 | 当存在ONBUILD关键字的镜像作为基础镜像的时候,在执行FROM完成后,会执行onbuild命令,但是不影响当前镜像 |
STOPSIGNAL | 发送信号量到宿主机 | 设置发送到容器的系统调用信号以退出 |
SHELL | 指定执行脚本的shell | 指定run、cmd、entrypoint指定命令时使用的shell |
# 编写dockerfile文件
$ vim /root/MyDockerfileCentos
FROM centos:7
MAINTAINER daqiang
ENV MYPATH /root/daqiang/dockerfiles
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
# 使用编写的dockerfile文件构建镜像
docker build -f /root/MyDockerfileCentos -t mycentos:1.0