docker笔记

一、坑点

1、使用docker compose 是无法挂载单个文件的

1.1、问题描述

docker笔记_第1张图片

1.2、案例:

version: '3'  # 使用Docker-Compose版本
services:
    springboot-linux:
       image: linux-java-jar:1.0 
       ports:
          -  '15005:15005'
       networks:
          - kevin
       depends_on:
          - mysql 
       container_name: docker-springboot-centos  # mysql最后的容器名

    mysql: 
        image: linux-mysql:5.7  # 使用mysql:5.7镜像
        restart: always
        container_name: docker-mysql  # mysql最后的容器名
        environment:
            MYSQL_ROOT_PASSWORD: tAOXUECEO970312  # 设置root用户的密码
            MYSQL_ALLOW_EMPTY_PASSWORD: 'no'             # 设置不允许空密码连接
            MYSQL_DATABASE: 'linux'             # 设置数据库
        networks:
         - kevin
        volumes:                         # 将自己顶一个数据和配置文件映射到mysql容器对应的文件
            - '/usr/local/docker-mysql/data:/var/lib/mysql'
            - '/usr/local/docker-mysql/log:/var/log/mysql'
            - '/usr/local/docker-mysql/my.cnf:/etc/mysql/my.cnf' 
        ports:
            - '3307:3306'                # 将容器的3306端口映射到主机的3307
        command: --default-authentication-plugin=mysql_native_password

networks:                                # 定义网络地址
  kevin:

其中mysql服务挂载单个文件 - '/usr/local/docker-mysql/my.cnf:/etc/mysql/my.cnf'会报如下错误:

docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/usr/local/docker-mysql/my.cnf" to rootfs at "/etc/mysql/my.cnf": mount /usr/local/docker-mysql/my.cnf:/etc/mysql/my.cnf (via /proc/self/fd/6), flags: 0x5000: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.

1.3、解析

案例问题解析,挂载只能挂载目录

1.4、解决方案

只挂载目录
-v /usr/local/docker-mysql/conf:/etc/mysql

2、docker-compose.yml文件编写需要完全正确,建议copy,因为编码问题也会导致无法构建成功

可以用docker compose config -q命令测试文件编写是否有问题

2.1、正确的样例:docker-compose.yml

version: '3'  # 使用Docker-Compose3.0版本
services:
    springboot-linux:
       image: registry.cn-shanghai.aliyuncs.com/kevinwwk/centos-java:1.0 
       ports:
          -  '15005:15005'
       networks:
          - kevin
       depends_on:
          - mysql 
       container_name: docker-springboot-centos  # mysql最后的容器名

    mysql: 
        image: registry.cn-shanghai.aliyuncs.com/kevinwwk/mysql-plus:5.7  # 使用mysql:5.7镜像
        restart: always
        container_name: docker-mysql  # mysql最后的容器名
        environment:
            MYSQL_ROOT_PASSWORD: tAOXUECEO970312  # 设置root用户的密码
            MYSQL_ALLOW_EMPTY_PASSWORD: 'no'             # 设置不允许空密码连接
            MYSQL_DATABASE: 'linux'             # 设置数据库
        networks:
         - kevin
        volumes:                         # 将自己顶一个数据和配置文件映射到mysql容器对应的文件
            - '/usr/local/docker-mysql/data:/var/lib/mysql'
            - '/usr/local/docker-mysql/log:/var/log/mysql'
            - '/usr/local/docker-mysq/conf:/etc/mysql' 
        ports:
            - '3307:3306'                # 将容器的3306端口映射到主机的3307
        command: --default-authentication-plugin=mysql_native_password

networks:                                # 定义网络地址
  kevin:

二、标准样例

1.1、运行mysql

1.1.1、拉取镜像

docker pull mysql:5.7

1.1.2、运行mysql镜像,同时挂载

docker run -d --privileged=true --name 容器名称 \
-e MYSQL_ROOT_PASSWORD=密码 \
-v /usr/local/docker-mysql/data:/var/lib/mysql \
-v /usr/local/docker-mysql/log:/var/log/mysql \
-v /usr/local/docker-mysql/conf:/etc/mysql \
-p 3306:3306 \
镜像名称:镜像版本号

1.2、构建centos7.0-jdk8.0镜像的Dockerfile

# 基础镜像
FROM centos:7

# 开发者
MAINTAINER kevin<1710102790@qq.com>

# 定义的环境变量,镜像centos7的默认路径
ENV DEFAULT_PATH /usr/local

# 默认的工作目录,会默认进入该目录
WORKDIR $DEFAULT_PATH

# 3.安装java8的基础环境,依赖库,build时运行命令
RUN yum -y install glibc.i686
# 创建java的目录,在镜像中创建一个目录,存放java环境
RUN mkdir /usr/local/java
# 相对路径,把当前目录下的外部依赖包 导入镜像中,并解压
ADD jdk-8u192-linux-x64.tar.gz /usr/local/java/
# 配置java的环境变量
# jdk所在目录
ENV JAVA_HOME /usr/local/java/jdk1.8.0_192
# java的运行时环境目录
ENV JRE_HOME $JAVA_HOME/jre
# 类的全路径
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
# 系统路径
ENV PATH $JAVA_HOME/bin:$PATH

## 导入springboot软件包,并运行
# 从宿主机上导入 jar包并解压
ADD linux-0.0.1-SNAPSHOT.jar /linux-java.jar
# 使用bash命令解释器 执行 touch命令,更新jar包的运行时间,便于监控发版时间
RUN touch /linux-java.jar
RUN echo "build completed!!!"

EXPOSE 15005 # 容器的端口,即后台程序的端口,如果后续构建了镜像,又用docker compose进行容器编排启动,宿主机的映射端口可以任意改,但是需要保持docker-compose.yml中容器的端口跟Dockerfile构建的镜像的端口一致
ENTRYPOINT ["java", "-jar", "/linux-java.jar"]

1.3、构建java8+springboot镜像的Dockerfile

FROM java:8

MAINTAINER kevin

# 在宿主机的/var/lib/docker/创建一个临时文件 挂载 到容器的/tmp目录下
VOLUME /tmp

# 从宿主机上导入 jar包并解压
ADD linux-0.0.1-SNAPSHOT.jar linux-java.jar

# 运行jar包
# 使用bash命令解释器 执行 touch命令,更新jar包的运行时间,便于监控发版时间
RUN bash -c 'touch /linux-java.jar'

# 在终端执行运行jar的命令
ENTRYPOINT ["java", "-jar", "/linux-java.jar"]

# 暴露容器的端口
EXPOSE 15005

三、docker的安装

1.1、安装

docker官网
docker官方镜像库-速度较慢,国内建议修改镜像源
docker笔记_第2张图片

sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

1.2、国内镜像源加速

docker笔记_第3张图片

直接copy即可

{
  "registry-mirrors": ["https://maabwtlg.mirror.aliyuncs.com"],  # 自己阿里云账号注册的镜像加速服务的地址
  "insecure-registries": ["192.168.19.132【私服ip地址】:5000"] # 如果需要构建私有库,则需要开放私有库http上传链接,这个端口是启动registry镜像时开放的端口
}

本地镜像上传私服教程
本地镜像上传阿里云教程

四、常用命令

1、通用


-------------镜像----------------
# 查看镜像
docker images
# 查看正在运行中的容器
docker ps
# 删除镜像
docker rmi 镜像ID
# 重命名
docker tag 镜像ID 新镜像名称:版本号
docker rmi 旧镜像名称:旧版本号

-------------容器----------------
# 查看全部(包括历史)容器
docker ps -a 
# 简短的查看全部(包括历史)容器
docker ps -a -q
# 强制删除全部容器
docker rm -f $(docker ps -a -q)
# 强制删除全部容器
docker rm -f 镜像ID

-------------镜像构建----------------
# 用正在运行的容器构建一个镜像
docker commit -m="描述" -a="作者" 镜像ID 镜像名称:镜像版本
# 用Dockerfile构建镜像,需要命令行cd进入Dockerfile文件所在目录下  注意末尾有个.
docker build -t 容器名称:镜像版本 .
# 用docker-compose.yml运行已有镜像的容器 需要命令行cd进入docker-compose.yml文件所在目录下 -d为后台启动
docker-compose up -d
# 可以检测文件是否编写正确
docker-compose config -q 

你可能感兴趣的:(docker,容器,运维,java)