docker快速入门
快速入门
🔗 官方文档 https://docs.docker.com/
Docker
docker类似于VMware是可以在linux上运行的“虚拟机”管理工具
基础命令
从仓库下载镜像:
从仓库下载最新的镜像
1 | docker pull nginx |
相当于
1 | docker pull nginx:latest |
查看本地有哪些镜像
1 | docker images |
运行容器
1 | docker run nginx |
这样只是简单的运行容器。可以添加参数
1 | docker run -d -p 外部:80 nginx |
d
后台运行容器p
配置内外端口映射,-name
指定容器运行的名字v
映射文件,比如可以讲当前文件夹映射到/usr/share/nginx/html
选项 | 选项简写 | 说明 |
---|---|---|
–detach | -d | 在后台运行容器,并且打印容器id。 |
–interactive | -i | 即使没有连接,也要保持标准输入保持打开状态,一般与 -t 连用。 |
–tty | -t | 分配一个伪tty,一般与 -i 连用。 |
https://blog.csdn.net/claram/article/details/104228727
查看正在运行的容器有哪些
1 | docker ps |
对容器进行修改
执行以下命令进入到容器当中,对容器进行修改
1 | docker exec -it 容器id bash |
退出容器
1 | exit |
强制删除容器
1 | docker rm -f 容器id |
生成一个新的镜像
1 | docker commit 容器id 新镜像名字 |
注意:如果容器的数据通过 volume 挂载在宿主机时 commit 生成的镜像不会包含这部分的数据
我的 做法是通过 docker inspect 查看 挂载路径,然后备份该路径的文件,容器迁移时需要转移该备份到> 新的服务器上
通过Dockerfile构建镜像
1 | FROM nginx |
1 | docker build -t 镜像名 dockerfile路径 |
保存镜像为文件
1 | docker 镜像id > 文件名 |
删除镜像
1 | docker rmi 镜像id |
导入镜像
1 | docker load < 文件名 |
cp 命令
容器到宿主机
1 | docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- |
宿主机到容器
1 | docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH |
OPTIONS说明:
- L :保持源目标中的链接
镜像制作
容器转镜像
- docker commit 容器id 镜像名称:b版本号
- docker save -o 压缩文件名称 镜像名称:版本号
- docker load -i 压缩文件名称
dockerfile
关键字 | 作用 | 备注 | |
---|---|---|---|
FROM | 指定父镜像 | 指定dockerfile基于那个image构建 | |
MAINTAINER | 作者信息 | 用来标明这个dockerfile谁写的 | |
LABEL | 标签 | 用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看 key value | |
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 那么ENV的相同名字的值始终覆盖arg的参数 | |
VOLUME | 定义外部可以挂载的数据卷 | 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”] docker inspect xxx \ | grep Source 查看挂载地址 |
EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp | |
WORKDIR | 工作目录 | 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径 | |
USER | 指定执行用户 | 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户 | |
HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制 | |
ONBUILD | 触发器 | 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大 | |
STOPSIGNAL | 发送信号量到宿主机 | 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。 | |
SHELL | 指定执行脚本的shell | 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell |
构建命令 不要漏掉最后一个 句号 “.”1
docker build -f ./dockerfile -t app:1 .
-f 指定dockerfile文件路径
-t 指定镜像名称和路径
网络
前言
docker 的网络模式主要有三种,bridge、host、none;
- bridge是docker安装后自动创建的虚拟网卡,创建容器时默认使用此模式。
- host是指容器与宿主机共用宿主机的网络
- none是指不创建网络
- 查看docker的网络模式docker network ls
docker 默认的网卡不支持固定ip,需自定义网络,使用自定义的网络来固定ip
- 创建自定义网络docker network create
- 删除自定义网络docker network rm
- 查看网卡信息docker network inspect
创建自定义网络
1 | docker network create --subnet=172.127.0.0/24 --gateway=172.127.0.1 docker-br0 |
- —subbet Ip地址
- —gateway 网关
- docker-br0 是自定义网络名称
创建容器
1 | docker run -i -d -h oracledb --name oracle11g --network docker-br0 --ip 172.127.0.100 -p 1122:22 -p 1121:1521 --privileged=true centos:7 /usr/sbin/init |
- /usr/sbin/init 启动容器之后可以使用systemctl方法
- privileged=true 获取宿主机root权限(特殊权限-)
su命令和su -命令最大的本质区别就是:前者只是切换了root身份,但Shell环境仍然是普通用户的Shell;而后者连用户和Shell环境一起切换成root身份了。
创建虚拟网络
要想多容器之间互通,从 Web 容器访问 Redis 容器,我们只需要把他们放到同个网络中就可以了。
文档参考:https://docs.docker.com/engine/reference/commandline/network/
演示
创建一个名为test-net的网络:1
docker network create test-net
运行 Redis 在 test-net 网络中,别名redis1
docker run -d --name redis --network test-net --network-alias redis redis:latest
修改代码中访问redis的地址为网络别名
运行 Web 项目,使用同个网络1
docker run -p 8080:8080 --name test -v D:/test:/app --network test-net -d test:v1
查看数据
容器终端查看数据是否一致
相关其他命令
1 | docker ps 查看当前运行中的容器 |