docker学习笔记
基本使用
搜索镜像
docker search xxx
eg:
docker search mysql
下载镜像
docker pull [镜像仓库地址]镜像名[:标签]
eg:
docker pull mysql
docker pull mysql:lastest
docker pull mysql:5.7
列出镜像信息
docker images
查找帮助
docker images --help
列出容器信息
默认显示正在运行的容器
docker ps
列出所有容器
docker ps -a
过滤
docker ps -f status=exited
列出id
docker ps -q
docker ps -aq
docker ps -a -q
创建并运行容器
OPTIONS:选项,需要重点关注-d,-p,-v,-e,--restart
IMAGE:镜像信息,推荐使用 镜像名:TAG的写法,否则默认为lastest
ARG...: COMMAND命令的参数
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
删除容器
docker rm [选项] [容器id或容器名...(可以写多个)]
强制删除容器
docker rm -f [容器id或容器名...(可以写多个)]
强制删除所以容器
docker rm -f $(docker ps -a -q)
强制删除所以非运行状态的容器
docker rm -f $(docker ps -f status=exited -q)
进入容器执行命令
docker exec -it [容器id或容器名...(可以写多个)] /bin/bash
查看日志
docker logs [选项] [容器id或容器名]
打印一下
docker logs [容器id或容器名]
持续显示
docker logs -f [容器id或容器名]
查看最近3条日志
docker logs -n 3 [容器id或容器名]
容器文件拷贝
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
容器运行和停止
docker start [选项] [容器id或容器名]
docker stop [选项] [容器id或容器名]
run命令详解
-p端口对外发布(端口映射)
docker run -p 宿主机端口:容器端口 镜像名
docker run -p 宿主机端口1:容器端口1 -p 宿主机端口2:容器端口2 ... 镜像名
-v数据卷
为什么要使用
1.要把容器中的容器持久化保存
2.需要宿主机和容器间的数据共享
概念理解
将宿主机目录或文件挂载到容器中,实现宿主机和容器之间的数据共享和持久化
用法
docker run -v 宿主机目录:容器目录[:读写权限(:ro read-only :rw 默认rw)] 镜像名
eg:
docker run -d -p 80:80 -v /home/index.html:/usr/share/nginx/html/index.html nginx
-e设置环境变量
为什么要用
容器中某些变量不能直接写死,需要让使用者在创建容器的时候指定,这种情况镜像中一般是定义环境变量来使用
例如mysql容器的root密码,遇到这种镜像创建的容器我就可以使用-e来设置环境变量的值
用法
docker run -e 变量名=变量值 镜像名
eg:
docker run -d -p 3306:3306 -v /home/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password mysql:5.7
--name机器命名
为什么要用
需要帮助我们更快的识别容器的作用
用法
docker run --name 需要定义的容器名 镜像名
eg:
docker run --name nginx-test nginx
--restart容器退出后的重启策略
用法
docker run --restart 重启策略 镜像名
no:容器退出不会自动重启
always:容器总是在退出后自动重启
on-failure[:max-retries]:容器仅在非正常退出时重启,可以指定最大重试数
unless-stopped:容器会在退出后自动重启,除非手动停止容器
默认策略:no
eg:
docker run -d --restart always nginx
其他
镜像详细信息
docker image inspect [镜像id或镜像名]
容器详细信息
docker inspect [容器id或容器名]
容器内进程
docker top [容器id或容器名]
数据卷高级
别名
docker run -v 数据卷别名:容器目录[:读写权限] 镜像名
eg:
docker run -v nginx_html:/usr/share/nginx/html nginx
列出所有数据卷
docker volume ls
查看数据卷详情
docker volume inspect 数据卷名
创建数据卷
docker volume create 数据卷名
删除数据卷
docker volume rm 数据卷名
docker网络(网桥)
为什么要用
虽然默认情况下容器和容器可以使用网络通信,但是每一次创建容器都是Docker给容器分配的ip地址
这让我们使用起来非常不方便
这些情况我们都可以创建自定义网络来解决这些问题
把需要相互连通的容器加入同一个网络,这样容器和容器之间就可以通过容器名来代替ip地址
进行相互访问
创建网络
docker network create 网络名
eg:
docker network create blog_net
列出网络
docker network ls
加入网络
创建容器时加入
docker run --network 网络名 镜像名
容器创建后加入
docker network connect [选项] 网络名 容器名或容器id
eg:
docker network connect blog_net blog
查看网络详情
docker network inspect 网络名或网络id
删除网络
docker network rm 网络名或网络id
DockerFile
基本语法
创建文件
HelloWorld
编写指令
FROM centos:7
CMD ["echo","helloworld"]
编写镜像
docker build -t hello:1.0 -f HelloWorld .
-t 用来指定镜像名和标签
-f 指定DockerFile文件
. DockerFile文件路径
指令学习
FROM
作用:用来定义基础镜像
用法
FROM 镜像名:标签名
eg:
FROM centos:7
作用时机
构建镜像的时候
CMD
作用
用来定义容器运行时的默认命令,可以在docker run的时候覆盖掉CMD中定义的命令
eg:
docker run hello:1.0 echo test
作用时机
容器运行的时候
用法
1.
CMD ["命令1","参数1","参数2"...]
这种形式不会展开环境变量
2.
CMD echo $HOME
这种形式会展开环境变量
如果写入多个CMD,只有最后一个CMD会起作用
ENV
用法
ENV 变量名=变量值
注意CMD
可以是
CMD ["sh","-c","echo $CONTENT"]
WORKDIR
作用
作用用于设置当前工作目录,如果不存在会创建,如果父目录不存在,也会自动创建
作用时机
创建镜像的时候
RUN
作用
它是用来定义构建过程中执行的命令
作用时机
构建镜像的时候
eg:
FROM centos:7
ENV CONTENT="helloworld"
WORKDIR /app/helloworld
RUN echo $CONTENT > content.txt
CMD ["cat","content.txt"]
ADD
作用
把构建上下文中的文件或网络文件添加到镜像中
如果文件是一个压缩包的话会自动解压
如果文件是网络中的文件不会自动解压
用法
ADD 源路径 目标路径
eg:
ADD blog-vue.tar.gz .
ADD https://example.com/blog-vue.tar.gz .
作用时机
构建镜像的时候
EXPOSE
作用
暴露需要发布的端口,让镜像使用者知道应该发布哪些端口
用法
EXPOSE 端口号1 端口号2...
COPY
作用
从构建上下文中复制内容到镜像中
用法
COPY 原路径 目标路径
ENTRYPOINT
作用
用来定义容器运行的默认命令,docker run时候无法覆盖ENTRYPOINT里的内容
作用时机
运行容器的时候
用法
ENTRYPOINT ["命令1","参数1","参数2"...]
DockerCompose
idea安装docker插件
command
覆盖容器启动后的默认指令
environment
指定环境变量,相当于run的-e选项
image
指定镜像
networks
指定网络,相当于run的--network
ports
用来指定要发布的端口,相当于run的-p
volumes
用来指定数据卷,相当于-v
restart
用来指定重启策略,相当于--restart
推送镜像到镜像仓库
1.注册Docker Hub账号
2.登录镜像仓库
docker login
然后输入用户名密码
3.构建镜像
docker build -t 用户名/镜像名:tag -f DockerFile .
4.给镜像打标签
docker tag 用户名/镜像名:tag 用户名/镜像名:tag
5.推送镜像
docker push 用户名/镜像名:tag
部署案例
mysql部署
docker run -d \
--name blog_mysql \
--network blog_net \
-v mysql_data:/var/lib/mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
--restart always \
mysql:5.7
导入.sql文件
redis部署
redis开启aof
redis-server --appendonly yes
docker run -d \
--name blog_redis \
--network blog_net \
-v redis_data:/data \
-p 6379:6379 \
--restart always \
redis:7.0 redis-server --appendonly yes
后端部署
使用openjdk 8u111去运行springboot
docker run -d \
--name blog \
--network blog_net \
-p 7777:7777 \
-v /usr/blog:/usr/blog \
--restart always \
java:openjdk-8u111 java -jar /usr/blog/blog.jar \
"--spring.datasource.url=jdbc:mysql://blog_mysql:3306/blog?characterEncoding=utf-8&serverTimezone=Asia/Shanghai" \
"--spring.datasource.username=root" \
"--spring.datasource.password=root" \
"--spring.redis.host=blog_redis"
或者DockerFile
FROM java:openjdk-8u111
WORKDIR /app
ADD blog.jar .
EXPOSE 7777
CMD ["jar","-jar","blog.jar","--spring.datasource.url=jdbc:mysql://blog_mysql:3306/blog?characterEncoding=utf-8&serverTimezone=Asia/Shanghai","--spring.datasource.username=root","--spring.datasource.password=root","--spring.redis.host=blog_redis"]
前端部署
docker run \
-p 80:80 \
--name blog-vue \
-v /usr/blog/blog-vue/dist:/usr/share/nginx/html \
--restart always \
nginx:1.21.5
或者
DockerFile
FROM nginx:1.21.5
WORKDIR /app
ADD blog-vue.tar.gz .
RUN cp -r blog-vue/dist/* /usr/share/nginx/html
EXPOSE 80
ENTRYPOINT ["nginx","-g","daemon off;"]
使用docker-compose.yml编写
version:2
services:
#mysql
blog_mysql:
image: mysql:5.7
volumes:
- mysql_data:/var/lib/mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: root
restart: always
networks:
- blog_net
#redis
blog_redis:
image: redis:7.0
volumes:
- redis_data:/data
ports:
- 6379:6379
restart: always
command: ['redis-server','--appendonly','yes']
networks:
- blog_net
#后端服务
blog:
image: blog:01
ports:
- 7777:7777
restart: always
networks:
- blog_net
#前端服务
blog-vue:
image: blog-vue:01
ports:
- 80:80
restart: always
networks:
blog_net
volumes:
mysql_data:
external: true
redis_data:
external: true