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
启动容器
启动 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 页面
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
mini-镜像
编写自己的应用
创建 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 端口打开网站即可