Skip to content

Docker实战

参考: https://www.bilibili.com/video/BV1og4y1q7M4?p=4

概览

docker出现原因:

  • 镜像解决开发与运维环境问题
  • 容器隔离解决应用冲突以及性能问题

docker与传统虚拟机的区别;

  • 传统虚拟机, 虚拟出硬件, 运行一个完整的操作系统, 然后在这个系统上安装和运行软件
  • 容器内的应用是直接运行在宿主机的内容, 容器是没有自己的内核的, 也没有虚拟硬件, 因此轻便
  • 每个容器互相隔离, 有属于自己的文件系统, 互不影响

docker在DevOps上的优势:

  1. 应用更快速的交付和部署
  2. 更便捷的升级和扩缩容
  3. 更简单的系统运维
  4. 更高效的计算资源利用

安装使用

docker概念

  • 镜像(image): 模板, 可以通过镜像来创建多个容器服务
  • 容器(container): Docker利用容器技术, 来独立运行一个或者一组应用
  • 仓库(repository): 存放镜像的地方, 分为公有仓库和私有仓库

安装步骤: https://docs.docker.com/engine/install/centos/

plain
1. 卸载旧版本
$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
 
2. 安装需要的安装包
yum install -y yum-utils

3. 设置镜像的仓库
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

# 查看仓库配置
cat /etc/docker/daemon.conf
# 配置阿里云镜像加速
登录阿里云-->容器镜像服务-->镜像加速器

# 默认是国外的, 这是补充:
Docker中国区官方镜像
https://registry.docker-cn.com
网易
http://hub-mirror.c.163.com
ustc 
https://docker.mirrors.ustc.edu.cn
中国科技大学
https://docker.mirrors.ustc.edu.cn

4. 更新yum软件包索引
yum makecache fast

5. 安装相关依赖
yum install docker-ce docker-ce-cli containerd.io

6. 启动
systemctl start docker

7. 验证
docker version
docker run hello-world

8. 卸载
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker

Docker的常用命令

帮助命令

plain
docker --version
docker info # 显示docker的系统信息, 包括镜像和容器的数量
docker --help

镜像命令

plain
docker images # 查看所有镜像
参数:
-a # 显示所有
-q # 只显示镜像的id

docker search [镜像名] # 搜索镜像
示例: docker search mysql -f=stars=3000 # 搜索星数>3000的mysql镜像

docker pull [镜像名] [tag] # 下载镜像, 通过tag指定版本, 不然下载的是lastest最新版的
示例: docker pull mysql:5.7 

docker rmi -f [镜像id或名称] # 删除镜像
docker rmi -f $(docker images -aq) # 删除所有的镜像
示例: docker rmi -f mysql:5.7

提交镜像
docker commit -m="描述信息" -a="作者" [容器id] [目标镜像名]:[tag]
示例: docker commit -a="xinzhang" -m="20210228test" e6f290b2784b test-centos:1.0

通过dockerfile来构建镜像
docker build -f [dockerfile路径] -t [生成的镜像名]:[版本] [存放镜像的位置] 
示例: docker build -f /opt/test/dockerfile1 -t test2-centos:1.0 .

容器命令

plain
docker run [参数] [镜像]
参数:
--name="Name" 指定容器名
-d 指定后台方式运行
-it 使用交互方式运行, 进入容器查看内容
-p 指定容器的端口 
	-p 主机端口:容器端口(常用)
  -p 容器端口
-P 随机指定端口
--net 指定自定义网络

示例:
docker run -it centos /bin/bash 运行centos容器并进入命令行
docker run -d -P --name tomcat-net-01 --net mynet tomcat

docker ps 查看运行中的容器
参数:
-a 查看容器运行记录(当前的+历史)
-n=? 显示最近创建的容器
-q 只显示容器的编号

示例:
docker ps -a -n=1 显示最近创建的一个容器

exit # 退出容器
ctrl+p+q # 容器不停止退出

docker rm [容器id] # 删除容器, 不能删除正在运行的容器, 强制删除-f
docker rm -f $(docker ps -aq) # 删除所有的容器
docker ps -a|xargs docker rm # 删除所有的容器

启动和停止容器的操作
docker start [容器id]
docker restart [容器id]
docker stop [容器id]
docker kill [容器id] # 强制停止当前容器

- 运行容器时挂载目录
docker run -it -v [主机目录]:[容器内目录] [镜像名]:[版本]
示例: docker run -it -v /test:/test centos /bin/bash

- 具名挂载, 这里的卷名不带路径/, 注意区分指定路径挂载
docker run -v [卷名]:[容器内目录] [镜像名]:[版本]
示例: docker run -it -v testMount:/opt centos /bin/bash

- 匿名挂载
docker run -v [容器内目录] [镜像名]:[版本]
示例: docker run -it -v /opt -name=centos2 centos /bin/bash

- 查看所有的卷的情况
docker volume ls
- 查看某一个卷的详细情况
docker volume inspect [卷名]

其他命令

plain
- 查看容器内存使用情况
docker stats

- 后台启动容器
docker run -d [镜像名] 

注意: 使用后台运行必须要有一个前台进程, docker发现没有应用会自动停止
示例: docker run -d centos 启动后容器会自动关闭

- 查看最近的10条日志
docker logs -tf --tail 10 [容器id] 

- 查看容器内部的进程信息
docker top [容器id]

- 查看容器的元信息
docker inspect [容器id]

- 进入当前正在运行的容器
方式一: 开启一个新的终端
docker exec -it [容器id] [命令]
示例: docker exec -it xxx /bin/bash

方式二: 进入正在执行的终端
docker attach [容器id]

- 从容器内拷贝文件到宿主机上
docker cp [容器id]:[容器目录] [主机目录]
示例: docker cp 01346b32fc96:/a.txt /

1745223687288

docker安装软件示例

安装nginx

plain
- 安装nginx
docker pull nginx
docker run -d --name nginx01 -p 3344:80 nginx
测试: curl localhost:3344

- 安装tomcat
docker pull tomcat:9.0
docker run -d --name tomcat01 -p 3355:8080 tomcat

可视化

rancher

portainer, 图形化界面管理工具

plain
docker run -d -p 30009:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

访问: http://39.106.55.179:30009/

Docker概念详解

镜像是一种轻量级, 可执行的独立软件包, 用来打包软件运行环境和基于运行环境开发的软件, 它包含运行某个软件所需的所有内容, 包括代码, 运行时库, 环境变量和配置文件. 1745223707256

docker镜像加载原理

笔记没做完, 这个..百度吧...

容器数据卷

将容器内的目录挂载到宿主机上, 以实现容器数据的持久化和同步操作, 且容器间的数据共享.

注意: 同步始终是双向的

挂载方式一: 运行容器时挂载

挂载到主机目录

plain
- 运行容器时挂载目录
docker run -it -v [主机目录]:[容器内目录] [镜像名]:[版本]
示例: docker run -it -v /test:/test centos /bin/bash

示例: mysql将数据盘挂载到主机上, 这样容器关闭或者删除后, 数据依然保存在主机上

plain
docker pull mysql:5.7
docker run -d -p30009:3306 -v /opt/test/mysql/conf:/etc/mysql/conf.d -v /opt/test/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
注: 其中-e MYSQL_ROOT_PASSWORD=123456设置mysql密码, 详见dockerhub的镜像的帮助文档

具名和匿名挂载

plain
- 具名挂载, 这里的卷名不带路径/, 注意区分指定路径挂载
docker run -v [卷名]:[容器内目录] [镜像名]:[版本]
示例: docker run -it -v testMount:/opt centos /bin/bash

- 匿名挂载
docker run -v [容器内目录] [镜像名]:[版本]
示例: docker run -it -v /opt -name=centos2 centos /bin/bash

- 查看所有的卷的情况
docker volume ls
- 查看某一个卷的详细情况
docker volume inspect [卷名]

docker容器内的卷, 没有指定目录的情况下都是在: /var/lib/docker/volumes/[卷名]/_data 下 1745223727285

** 通过具名挂载方便找到卷, 因此多数情况下使用具名挂载!**


拓展

plain
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

注意: ro表示readOnly, rw表示readWrite
设置了ro, 则这个路径只能通过宿主机来操作, 容器内部无法操作!

挂载方式二: 通过DockerFile构建镜像时挂载

DockerFile就是用来构建镜像的命令脚本

plain
先编写dockerfile
------------
FROM centos

VOLUME ["volume1","volume2"]

CMD echo "-----success-----"

CMD /bin/bash
---------------

通过dockerfile来构建镜像
docker build -f [dockerfile路径] -t [生成的镜像名]:[版本] [存放镜像的位置] 
示例: docker build -f /opt/test/dockerfile1 -t test2-centos:1.0 .

通过test2-centos构建的容器, 由于配置了匿名挂载, 因此在/文件夹下会生成挂载的目录 1745223743076

通过 docker inspect [容器id] 也能查看到卷的挂载情况 1745223748694

多容器间数据同步

如下图, 通过--volumes-from 创建的容器会相互绑定, 数据互通 1745223756514

示例: 1745223762297

DockerFile

使用dockerfile构建步骤:

  1. 编写dockerfile文件
  2. docker build 构建成为一个镜像
plain
通过dockerfile来构建镜像
docker build -f [dockerfile路径] -t [生成的镜像名]:[版本] [存放镜像的位置] 
示例: docker build -f /opt/test/dockerfile1 -t test2-centos:1.0 .
  1. docker run 运行镜像
  2. docker push 发布镜像(dockerhub, 阿里云)

dockerfile指令基础:

  • 每个保留关键字(指令)都必须是大写单词
  • 从上到下执行
  • 表示注释

  • 每一个指令都会创建提交一个新的镜像层并提交
plain
FROM 				# 基础镜像
MAINTAINER 	# 作者, 一般为姓名+邮箱
RUN 				# 镜像构建是要运行的脚本
ADD					# 步骤
WORKDIR			# 工作目录
VOLUME			# 工作目录
EXPOST 			# 暴露端口
CMD					# 指定容器启动时要运行的命令, 只有最后一个会生效, 可被替代
ENTRYPOINT 	# 指定容器启动时要运行的命令, 可以追加命令
ONBUILD			# 当构建一个被继承 dockerfile 时运行的指令
COPY				# 将文件拷贝到镜像中
ENV 				# 构建时设置环境变量

1745223775376

示例:

plain
FROM centos
MAINTAINER xinzhang

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash

可以通过docker history [镜像id] 来查看镜像构建的历史步骤

CMD与ENTRYPOINT的区别:

构建的镜像运行时添加命令, 则会覆盖CMD的命令; ENTRYPOINT则是追加命令后面

plain
示例: $vim dockerfile-cmd-demo
----------------
FROM centos
CMD ["ls"]
----------------
$docker build -f dockerfile-cmd-demo -t cmd-demo .
$docker run cmd-demo -a
=================报错如下, 因为-a无法追加到"ls"后面, -a会直接替换"ls"; ENTRYPOINT则可以追加
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.

示例: 创建tomcat的Dockerfile

下面示例添加的压缩包会在构建镜像时自动解压, 但是我加的是rpm包不行, 镜像构建成功, 容器运行补起来, dockerfile这部分后续还需要补充学习

1745223789746

发布镜像

plain
- 在dockerhub注册账号, 先登录
docker login -u [dockerhub用户名]
- 输入密码后, 显示登录成功

- 更改镜像名以及标签
docker tag [镜像名]:[tag] [新镜像名]:[tag]

- 推送镜像, 一般镜像名为 作者名/镜像名
docker push [镜像名]:[版本号]


阿里云的直接找镜像容器服务, 创建命名空间, 基本信息里面有步骤讲的特清楚, 此处略

Docker网络

  • 首先宿主机内的各个容器都是互通的, 原理是利用宿主机进行桥接, 但是原生的桥接只能通过ip连通, 无法通过容器名连通
  • 容器启动时使用自定义网络, 则容器间直接用容器名可以互相连通, 可以应用在比如搭建redis集群, mysql集群

网络模式

  • bridge: 桥接模式(docker默认)
  • none: 不配置网络
  • host: 和宿主机共享网络
  • container: 容器内网络连通(一般不用)
plain
查看所有的docker网络
docker network ls

创建一个自定义网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
参数:
--driver bridge 指定网络模式
--subnet 192.168.0.0/16 子网
--gateway 192.168.0.1 网关
mynet 自定义的网络的名称

查看自定义网络详情
docker network inspect mynet

启动容器使用自定义网络
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat

此时能直接通过容器名连通
docker exec -it tomcat-net-01 ping tomcat-net-02

===========================
连接容器与自定义网络
docker network connect mynet tomcat01
连通后即将tomcat01放到mynet下

示例: 部署redis集群, 3分片, 3备份 17452238105531745223817485

springboot微服务打包docker镜像

idea下载docker插件, 在项目文件夹下编写Dockerfile 1745223823480

将jar包以及dockerfile上传至服务器, 并构建镜像, 启动容器

后续补充: docker compose, docker swarm jenkins, 我jio得还有launcher啥的