Docker 基础
1 Docker 的常用命令
# linux 启动docker
sudo systemctl start docker
# 帮助命令
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括容器
docker 命令 --help # 万能命令
# 镜像命令
docker image -a # 列出所有镜像
--all # 同上
-q # 只显示镜像的id
--quiet # 同上
docker image -aq # 只显示所有镜像的id
docker search 镜像名或内容 # 搜索镜像
docker pull 镜像名:tag # 下载镜像
docker rmi 镜像id # 删除镜像
docker rmi -f 镜像id, 镜像id, # 删除指定镜像,-f是force强制删除,可以是多个
docker rmi -f $(docker images -aq) # 删除所有镜像
# 容器命令 PS:有了镜像才可以创建容器
## 新建容器并启动
docker run [可选参数] 镜像名:tag
[可选参数]:
--name 容器名字 # 创建并运行 指定容器名字 的容器,不指定--name,则容器名字随机
-d # 后台方式运行
-i, -t, -it # 进入容器查看内容
-p 主机端口:容器端口 # 指定容器端口的映射
-P # 随机指定端口
## 列出容器
docker ps -a # 列出当前正在运行的容器 + 历史运行过的容器
-n=? # 显示最近创建的容器
-q # 显示容器的编号
## 退出容器
exit # 从容器中退回主机
Ctrl + P + Q # 容器不停止退出
## 删除容器
docker rm 容器id # 删除指定容器
docker rm -f $(docker ps -aq) # 删除所有容器 -f强制删除,运行的也要被删除
## 启动和停止容器的操作
docker start 容器id # 启动
docker restart 容器id # 重启
docker stop 容器id # 停止
docker kill 容器id # 强制停止
## 常用的其他命令
docker run -d 镜像名:tag # 后台启动容器
# 常见的坑: docker 容器使用后台远行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
# nginx 容器启动后,发现自己没有提供服务,就会立廖停止,没有程序了
docker log -ft 容器id # 显示日志
--tail number # 显示一定数据的日志
docker top 容器id # 查看进程信息
docker inspect 容器id # 查看容器内部信息
docker stats --no-stream # 查看容器 CPU、存内 使用情况
## 进入当前正在运行的容器
docker exec -it 容器id /bin/bash # 进入容器后,开启一个新终端操作
docker attach 容器id /bin/bash # 进入容器正在执行的终端
## 容器与主机的文件相互拷贝
docker cp 容器id:容器内路径 目的的主机路径 # 容器文件拷贝到主机
docker cp 目的的主机路径 容器id:容器内路径 # 主机文件拷贝容器
## 容器环境修改
docker run -d -p 8080:80 -e 环境配置内容 --name 容器名 镜像名:tag
## 交容器成为镜像
docker commit # 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 新的镜像名:[TAG]
# 容器数据卷
## 使用数据卷
docker run -it -v 主机目录:容器目录 --name 容器名 镜像id # 没有指定主机目录的情况下,会在主机下的 docker/volumes 下成生一个文件夹
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v 主机目录:容器目录 # 指定路径挂载
-v xxxxxxxxxxxxx:or # or readonly # 容器只读该路径,主机可读写
-v xxxxxxxxxxxxx:rw # 默认rw readwrite # 容器读写该路径
# --volumns-from: 使新建的容器02与已经存在的容器01有一样的挂载卷,他们都指向了宿主机中相同的文件夹
docker run -it --name 容器02 --volumns-from 容器01 镜像id
2 Dockerfile
Dockerfile 就是用来构建 docker 镜像的构建文件!命令脚本
构建镜像过程
- 编写一个 dockerfile 文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像(DockerHub、 阿里去镜像仓库)
2.1 Dockerfile 文件内容
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤: 如:加tomcat镜像,tomcat压缩包,添加的内容
WORKDIR # 镜像的工作目录
VOLUMN # 挂载的目录
EXPOSE # 暴露端口 如:80、8080
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 Dockerfile 这个时候就会运行 ONBUILD
COPY # 类似ADD,将我们的文件拷贝到镜像中
ENV # 构建的时候设置环境变量
2.2 构建镜像
# 我们可以列出本地镜像的变更历史,查看别人是怎么做的
docker history 镜像id
# dockerfile 构建镜像,注意:最后一定要有 .
docker build -f dockerfile文件 -t 镜像名 .
2.3 发布镜像
# 1、地址 https://hub.docker.com/ 注册自己的账号
# 2、确定账号可以登录
docker login -u 用户名 -p 密码 # 登录
docker push lqqgis/geoserver:1.0 # 上传镜像
docker tag 源镜像[:tag] 新的镜像[:tag] # 修改镜像tag
2.4 镜像 打包导出 与 离线导入
docker save 打包输出的路径 镜像id # 将镜像打包,发送给别人
docker save 镜像 -o 文件.tar # 将镜像打包,发送给别人
docker load -i 待加载的镜像的包 # 导入镜像
3 自定义网络
# 查看所有的docker 网络
docker network ls # bridge: 桥接(默认)
# none: 不配置网络
# host: 和宿主机共享网络
# container: 容器内网络连通(用的少,局限少大)
# 在用户不进行网络配置的情况下,默认直接启动容器,其实执行了下面的代码
docker run -d -P --name [容器名] --net bridge [镜像名]
# 上述代码,使用的是默认的docker0,特点是:默认,域名不能打通,--link 可以容器互连,但是比较麻烦
# 自己建立网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 [网络名,如mynet] # 65535个
# 使用自己建立的网络启动容器
docker run -d -P --name [容器名] --net mynet [镜像名]
# 测试
docker run -d -P --name tomcat-net01 --net mynet tomcat # ip:192.168.0.2
docker run -d -P --name tomcat-net02 --net mynet tomcat # ip:192.168.0.3
docker exec -it tomcat-net01 ping 192.168.0.3 # 可以ping通
# 上面形成了一个tomcat的网络集群
4 网络连通
docker network --help # 查看网络的所有命令信息,其中有一个是connect
# connect Connect a container to a network # 将容器连到一个网络上
docker network connect mynet tomcat01 # 将tomcat01 放到的mynet网络下,实现了 一个容器,两个IP地址
docker network connect bridge tomcat01 # 将默认的 bridge网络 与 配置在 tomcat01 容器中