Docker知识总结

概述

docker 主要提供三大功能 : 打包,分发,部署

打包:将软件运行环境,例如java环境,linux系统跟程序都打到一个包。

分发:将打好的包,上传镜像仓库,类似maven一样,共享给团队。

部署:跨平台运行打好的包。

镜像是—种轻量级、可执行的独立软件包。

docker使用

docker 常用命令

https://docs.docker.com/engine/reference/commandline/run/

docker ps 查看当前运行中的容器

docker images 查看镜像列表

docker rm container-id 删除指定 id 的容器

docker stop/start container-id 停止/启动指定 id 的容器

docker rmi image-id 删除指定 id 的镜像

docker volume ls 查看 volume 列表

docker network ls 查看网络列表

docker pull 拉取镜像

docker export [-o|–output[=“”]] container-id 导出容器 -o来指定导出的tar文件名

docker import 导入容器

导入导出例子

导出

docker export -o ubuntu-run.tar xxx

导入

docker import ubuntu-run.tar test-ubuntu:vl.0
run 参数

-d: 后台运行容器,并返回容器ID

-p: 指定端口映射,格式为:主机(宿主)端口:容器端口

–name=“xxx” 容器指定一个名称

挂载目录

  • bind mount 直接把宿主机目录映射到容器内,适合挂代码目录和配置文件。可挂到多个容器上

  • volume 由容器创建和管理,创建在宿主机,所以删除容器不会丢失,官方推荐,更高效,Linux 文件系统,适合存储数据库数据。可挂到多个容器上

  • tmpfs mount 适合存储临时文件,存宿主机内存中。不可多容器共享。

使用:

bind mount 方式用绝对路径 -v D:/code:/app

volume 方式,只需要一个名字 -v db-data:/app

示例:
docker run -p 8080:8080 --name test-service -v D:/code:/app -d test:v1

docker 安装常用软件

安装 redis
docker run -d -p 6379:6379 --name="redis5-0-14" redis:5.0.14
安装 mysql
docker run -p 3306:3306 --name mysql --privileged=true --restart unless-stopped -v D:\DockerFile\mysql8.0.20\mysql:/etc/mysql -v D:\DockerFile\mysql8.0.20\logs:/logs -v D:\DockerFile\mysql8.0.20\data:/var/lib/mysql -v D:\DockerFile\mysql8.0.20\mysql-files:/var/lib/mysql-files/ -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.20

Docker 多容器通信

第一步 创建虚拟网络

docker network create test-net

第二步 启动容器的时候指定虚拟网络

docker run -d --name redis --network test-net --network-alias redis redis:latest

–network-alias 后边是别名,就是域名,例如可以通过 http://redis:6379/XXX 访问

需要彼此间通信的容器,用同一个虚拟网络即可

镜像制作

dockerFile 文件语法

FROM(指定基础 image)

构建指令,必须指定且需要在 Dockerfile 其他指令的前面。后续的指令都依赖于该指令指定的 image。FROM 指令指定的基础 image 可以是官方远程仓库中的,也可以位于本地仓库

FROM centos:7.2
FROM centos
MAINTAINER(用来指定镜像创建者信息)

构建指令,用于将 image 的制作者相关的信息写入到 image 中。当我们对该 image 执行 docker inspect 命令时,输出中有相应的字段记录该信息。

MAINTAINER  wangyang "wangyang@itxdl.cn"
RUN(安装软件用)

构建指令,RUN 可以运行任何被基础 image 支持的命令。如基础 image 选择了 Centos,那么软件管理部分只能使用 Centos 的包管理命令

USER(设置container容器的用户)

设置指令,设置启动容器的用户,默认是 root 用户

EXPOSE(指定容器需要映射到宿主机器的端口)

设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。

当需要访问容器的时候,可以不是用容器的 IP 地址而是使用宿主机器的 IP 地址和映射后的端口。

要完成整个操作需要两个步骤,首先在 Dockerfile 使用 EXPOSE 设置需要映射的容器端口,然后在运行容器的时候指定 -P 选项加上 EXPOSE 设置的端口,这样 EXPOSE 设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用 -p 选项

ENV(用于设置环境变量)

构建指令,在 image 中设置一个环境变量。设置了后,后续的 RUN 命令都可以使用,container 启动后,可以通过 docker inspect 查看这个环境变量,也可以通过在 docker run --env key=value 时设置或修改环境变量。

ENV JAVA_HOME /path/to/java/dirent
ARG(设置变量)

起作用的时机

arg 是在 build 的时候存在的, 可以在 Dockerfile 中当做变量来使用
env 是容器构建好之后的环境变量, 不能在 Dockerfile 中当参数使用

COPY (从 src 复制文件到 container 的 dest 路径)
COPY <src> <dest>
VOLUME(指定挂载点)

设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是 AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在 Dockerfile中 使用该指令

WORKDIR(切换目录)

设置指令,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效

CMD(设置 container 启动时执行的操作)

设置指令,用于 container 启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条

ONBUILD(在子镜像中执行)

ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行

SpringBoot 打包为 DockerFile

先用maven 打 jar 包。

之后编写 dockerfile

# 该镜像需要依赖的基础镜像
FROM openjdk:8
# 指定维护者名称
MAINTAINER sjh xxx@qq.com
# 将jar包复制到docker容器/home/springboot目录下面
ADD /xx/xx.jar /home/springboot/xx.jar
# 声明服务运行在8080端口
EXPOSE 8080
# 执行命令
CMD ["java","-jar","/home/springboot/core242-0.0.1-SNAPSHOT.jar"]

将项目上传至服务器,进行docker build

docker build -t {container-name}:{tag} .

注意最后的 . 一定要有
执行完之后,可以用dokcer images查看build完的镜像

启动构建完成的镜像

docker run -d -p 8080:8080 --name {container-name} {container-name}:{tag}

#启动后可以使用docker ps -a查看容器状态,是否能够正常使用,如果未正常启动就需要自行检查配置的过程中是否出现失误,例如Dockerfile中的CMD或者ADD的文件路径是否正确等。

镜像分层原理

镜像分层有点类似 Git,提交之后又删除,但实际这个文件的数据还在 Git中。

每一个 run 命令都会增加一个分层,最多127个run

制作精简镜像方法

  1. 选用更小的基础镜像
  2. 串联 Dockerfile指令
  3. 压缩镜像
  4. 使用容器专用的基础镜像—scratch或者busybox 作为基础镜像。

镜像一般不用centos,太臃肿,更适合物理机。
推荐使用 debian,作为基础镜像。

docker build -t redis:v1 -f {dockerfileName}

未优化的 dockerfile

FROM 192.168.5.160/library/debian:jessie
ENV VER    3.0.0
ENV TARBALL http://download.redis.io/releases/redis-$VER.tar.gz
#=> Install curl and helper tools . . .
RUN apt-get update
RUN apt-get install -y curl make gcc
#==>Download, compile, and instail. . .
RUN curl -L $TARBALL | tar zxv
WORKDIR    redis-$VER
RUN make
RUN make install
#...
#==>Clean up . . .
WORKDIR /
RUN apt-get remove -y --auto-remove curl make gcc
RUN apt-get clean
RUN rm -rf /var/lib/apt/lists/*    /redis-$VER
#...
CMD [ " redis-server" ]

Dockerfile中的RUN指令通过&&和\支持将命令串联在一起,有时能达到意想不到的精简效果。

串联命令后的 dockerfile , 只是例子,看看 && \

FROM centos:latest
MAINTAINER www.kubemsb.com
RUN yum install epel-release -y && \
    yum install -y gcc gcc-c++ make

RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && \
    tar zxf php-5.6.36.tar.gz && \
    cd php-5.6.36 && \
    ./configure --prefix=/usr/local/php && \
    make -j 4 && make install
EXPOSE 9000
CMD ["php-fpm"]

精简Docker镜像大小优点:
减少构建时间
减少磁盘使用量
减少下载时间
提高安全性,减少攻击面积

安装问题

wsl2 installation is incomplete

如果已安装,但还是提示,可能版本太老,可以直接访问该地址下载安装即可。

https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

docker 打开报错

System.InvalidOperationException: Failed to set version to docker-desktop: exit code: -1

cmd/shell下执行

netsh winsock reset

然后重启docker即可。

配置国内镜像

.docker/daemon.json 中添加

"insecure-registries": [
    "registry.docker-cn.com",
    "docker.mirrors.ustc.edu.cn"
  ],
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "http://registry.docker-cn.com",
    "http://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
  ]

“https://mirror.ccs.tencentyun.com” //腾讯

“http://registry.docker-cn.com” //docker官方提供的中国镜像

“http://docker.mirrors.ustc.edu.cn” //中国科学技术大学

“http://hub-mirror.c.163.com” //网易

有问题可以扫码,一起研究哈

在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宋小黑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值