Docker使用
Docker基础
虚拟化与容器化
虚拟化技术
- 基础镜像 GB 级别
- 创建使用稍微复杂
- 隔离性强
- 启动速度慢
- 移植与分享不方便
容器化技术
- 基础镜像 MB 级别
- 创建简单
- 隔离性强
- 启动速度秒级
- 移植与分享方便
Docker解决的问题
- 统一标准
- 应用构建:语言不通导致构建不同(Java、C++、JavaScript),使用 docker build 打成镜像来解决这个问题(类似 Windows exe)
- 应用分享:所有软件进行过放到一个指定地方 docker hub(类似应用市场)
- 应用运行:统一标准的镜像,docker run
- 资源隔离
- cpu、memory 资源隔离与限制
- 访问设备隔离与限制
- 网络隔离与限制
- 用户、用户组隔离限制
Docker架构
Docker Host
安装 Docker 的主机
Docker Daemon
运行在 Docker 主机上的 Docker 后台进程
Client
操作 Docker 主机的客户端(命令行、UI 等)
Registry
镜像仓库、Docker Hub
Images
镜像,带环境打包好的程序,可以直接启动运行
Containers
容器,由镜像启动起来正在运行中的程序
安装Docker
移除以前 docker 相关包
bash$ yum remove docker
配置 yum 源
bash$ yum install -y yum-utils $ yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装 docker
- docker-ce 服务器
- docker-ce-cli 命令行
- containerd.io 容器化运行环境
bash$ yum install -y docker-ce docker-ce-cli containerd.io
启动
bash$ systemctl start docker # 开启自启并立即启动 $ systemctl enable docker --now
配置加速
bash$ mkdir -p /etc/docker $ vim daemon.json { "registry-mirrors": ["https://ss0idbd1.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size":"200m" }, "storage-driver": "overlay2" } $ systemctl daemon-reload $ systemctl restart docker
Docker实战
找镜像
去 https://hub.docker.com/ 找镜像
bash
# 下载最新版本
$ docker pull nginx
# 下载指定版本
$ docker pull redis:6.2.4
删除镜像
- rmi 用于删除镜像
- rm 用于移除容器
bash
# 查看所有镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 2 years ago 141MB
redis 6.2.4 9dae5b22eb39 2 years ago 105MB
# 删除镜像
$ docker rmi 9dae5b22eb39
查看容器版本
bash
$ docker image inspect redis:latest | grep -i version
启动容器
启动 nginx 容器,并映射 88 端口,测试访问
bash
$ docker run --help
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Options:
-d, --detach Run container in background and print
--name string Assign a name to the container
--restart string Restart policy to apply when a container
-p, --publish list Publish a container's port(s) to the host
把服务器 88 端口代理 nginx 80 端口
bash
$ docker run --name=mynginx -d -p 88:80 --restart=always nginx
查看容器状态
bash
# 查看正在运行的容器
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
545cfdb127a9 nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:88->80/tcp mynginx
# 查看所有容器
$ docker ps -a
重新启动容器
bash
# 删除停止的容器(容器id/名字)
$ docker rm 545cfdb127a9
# 停止容器
$ docker stop mynginx
# 再次启动
$ docker start 545
进入容器修改容器内容
修改默认的 index.html 页面
exec -it
进入容器终端并且的保留为容器终端的输入形式(与 bash 结合作用)
bash
$ docker exec -it 545cfdb127a9 /bin/bash
[root@iZ2ze0hyayj33bt8xa06wjZ /] -> root@545cfdb127a9:/
$ cd /usr/share/nginx/html/
$ vim index.html
echo "<h1>Hello World</h1>" > index.html
提交改变
bash
$ docker commit --help
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Options:
-a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
-m, --message string Commit message
bash
$ docker commit -a "lyn" -m "首页变化" 545cfdb127a9 demo-nginx:v1.0
之后通过 docker images 就能查看到对应镜像了
镜像传输
bash
$ docker save --help
Usage: docker save [OPTIONS] IMAGE [IMAGE...]
Options:
-o, --output string Write to a file, instead of STDOUT
将镜像保存成压缩包
bash
$ docker save -o abc.tar demo-nginx:v1.0
别的机器加载导出的镜像
bash
$ docker load --help
Options:
-i, --input string Read from tar archive file, instead of STDIN
-q, --quiet Suppress the load output
bash
$ docker load -i abc.tar
挂载数据到外部修改
bash
$ docker run --name=mynginx -d -p 88:80 -v /home/xxx/html nginx
推送远程仓库
推送镜像到 docker hub,应用市场
bash
# docker tag local-image:tagname new-repo:tagname
$ docker tag demo-nginx:v1.0 xx/xx:v1.0
$ docker push new-repo:tagname
# 登录退出
$ docker login
$ docker logout
# 推送
$ docker push
查看日志
bash
$ docker logs 545cfdb127a9
# 实时打印日志
$ docker logs 545cfdb127a9 -f
复制配置(容器和服务器)
bash
$ docker cp 545cfdb127a9:/etc/nginx/nginx.conf /home
$ docker cp /home/nginx.conf 545cfdb127a9:/etc/nginx/nginx.conf
部署中间件redis
部署一个 Redis 应用,尝试应用操作 Redis 产生数据
Redis可视化管理工具下载:https://github.com/RedisInsight/RedisDesktopManager/releases/tag/0.9.3
bash
$ docker run -v /data/redis/redis.conf:/etc/redis/redis.conf -v /data/redis/data:/data -d --name myredis -p 6379:6379 redis redis-server /etc/redis/redis.conf
编辑 redis.conf
,添加密码
bash
$ vim redis.conf
appendonly yes
requirepass xxx
制作自己的镜像
编写自己的应用
创建 Java class,
controller.CounterController
javapackage com.example.javademo.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class CounterController { @Autowired(required = false) StringRedisTemplate redisTemplate; @GetMapping public String count() { Long increment = redisTemplate.opsForValue().increment("count-people"); return "有 [" + increment + "] 人访问了这个页面"; } }
编辑
application.properties
propertiesspring.data.redis.host=xxx spring.data.redis.password=xxx
将应用打包成镜像
以前的做法:
- SpringBoot 打包成可执行 jar
- 把 jar 包上传给服务器
- 服务器上运行 java -jar
现在的做法:所有机器都安装 Docker,任何应用都是镜像,所有机器上都可以运行
创建
Dockerfile
文件- java-8:
java:openjdk-8-jre-alpine
- java-17:
openjdk:17-jdk-alpine
dockerfileFROM openjdk:17-jdk-alpine WORKDIR /home COPY target/*.jar /home ENTRYPOINT java -jar *.jar
打包成镜像
bash$ docker build -t java-demo:v1.0 .
启动容器
bash$ docker run -d -p 9003:8080 java-demo:v1.0 --name myjavademo
之后访问 9003 端口打开网站即可