目录
(一)镜像命令
一、拉取Nginx
二、查看镜像
三、导出文件
四、删除镜像
五、加载镜像
(二)容器命令
一、例子:运行一个nginx容器
1、输入运行命令
2、使用命令查看宿主机ip
3、在外部浏览器访问
4、查看日志
二、例子:修改nginx的index.html文件
1、进入容器
2、进入HTML所在目录
3、修改内容
4、在网页查看
5、停止容器
6、重启容器
7、删除容器
8、展示容器
三、例子:创建并运行一个redis容器,并实现数据持久化
1、使用命令运行redis容器
2、进入容器,并执行redis-cli客户端命令,存入num=666
3、查看是否成功
注:也可以直接进入redis
四、数据卷
1、传统数据和容器耦合
2、使用数据卷解决问题
3、基本操作
4、数据卷的作用
五、例子:创建一个数据卷,并查看数据卷在宿主机的目录位置
1、使用命令创建数据卷
2、查看是否创建成功
3、查看详细信息
4、删除未使用的卷
六、例子:挂载数据卷
1、创建nginx容器并挂载
2、查看数据卷详细信息
3、复制文件位置,在Moba中找到文件
4、右键选择使用VSCode打开,并修改
5、在网页中查看
七、例子:创建并运行一个MySQL容器,将宿主机目录直接挂载到容器
1、下载或导入mysql镜像
2、创建目录
3、在conf中创建配置文件并编写
4、创建容器并挂载
6、总结
八、自定义镜像
九、例子:基于Ubuntu镜像构建一个新的镜像,运行一个java项目
1、创建docker-demo目录和Dockerfile文件,并在其中编写如下
2、向docker-demo中导入文件
3、输入命令,创建镜像
4、创建容器
5、在页面访问
十、例子:使用alpine创建镜像
1、修改dockerfile
2、构建镜像
十一、DockerCompose
1、作用:
十二、部署微服务集群
1、编写docker-compose.yml文件
2、将java代码中的数据库和nacos地址都改为yml文件中的服务地址
3、在每个微服务的pom文件中都加上打包依赖
4、清理缓存
5、打包
6、在target目录中找到jar包,并拷贝到对应目录
7、进入虚拟机,将cloud-demo文件夹导入tmp
8、进入cloud-demo文件并运行
docker pull nginx
docker images
docker save -o nginx.tar nginx:latest
docker rmi 名字:版本 或 ID
docker load -i nginx.tar
注:
暂停时,操作系统会将容器挂起;(可以恢复)
停止时,操作系统会将容器删除;(无法恢复)
所以不使用unstop;
docker run --name containerName -p 80:80 -d nginx
- docker run :创建并运行一个容器
- --name:给容器起一个名字,比如叫做mn
- -p︰将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
- -d:后台运行容器
- nginx:镜像名称,例如nginx
注意:
此命令会创建一个宿主机80端口和容器80端口的映射,当访问宿主机80端口时,请求会映射到容器的80端口,从而实现容器的访问。
ifconfig
docker logs -f 容器名 //跟踪日志输出
docker logs 容器名 //日志
docker exec -it mn bash
cd /usr/share/nginx/html
sed -i 's#Welcome to nginx#修改了这里#g' index.html
sed -i 's###g' index.html
docker stop mynginx
docker restart mynginx
docker start mynginx
docker rm mynginx //删除
docker rm -f mynginx //强制删除
docker ps //展示运行中容器
docker ps -a //展示所有容器
docker run --name redis -p 6379:6379 -d redis redis-server --appendonly yes
docker exec -it redis bash
redis-cli
set num 666
get num
docker exec -it redis redis-cli
将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全
docker volume create html
docker volume ls
docker inspect html
docker volume prune
docker run --name mynginx -p 80:80 -v html:/usr/share/nginx/html -d nginx
docker inspect html
注意:
若挂载时,数据卷不存在,docker会自动帮你生成;
docker pull mysql //下载
docker load -i mysql.tar //导入
mkdir -p mysql/data
mkdir -p mysql/conf
vi ms.cnf
[mysqld]
skip-name-resolve
character_set_server=utf8
datadir=/var/lib/mysql
server-id=1000
docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-p 3306:3306 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25
第一个-v,前面是宿主机配置文件位置,后面是容器配置文件位置;
第二个-v,前面是宿主机数据文件位置,后面是容器数据文件位置;
镜像是分层结构,每一层称为一个Layer:
详情查看官网
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 安装JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar.gz \
&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
docker build -t javaweb:1.0 .
// 镜像名 版本 所在目录
docker run --name web -p 8090:8090 -d javaweb:1.0
# 指定基础镜像
FROM openjdk:8-alpine
# 配置环境变量,JDK的安装目录
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
docker build -t javaweb:2.0 .
这个可以少几个步骤
version: "3.2"
services:
nacos:
image: nacos/nacos-server
environment:
MODE: standalone
ports:
- "8848:8848"
mysql:
image: mysql:5.7.25
environment:
MYSQL_ROOT_PASSWORD: 123
volumes:
- "$PWD/mysql/data:/var/lib/mysql"
- "$PWD/mysql/conf:/etc/mysql/conf.d/"
userservice:
build: ./user-service
orderservice:
build: ./order-service
gateway:
build: ./gateway
ports:
- "10010:10010"
app
org.springframework.boot
spring-boot-maven-plugin
docker-compose up -d