docker学习笔记

发布时间 2024-01-08 18:35:05作者: BattleofZhongDinghe


https://www.bilibili.com/video/BV1FC4y157gK

基本使用

搜索镜像

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