Docker容器脚本

内容纲要

1. mysql数据库

docker run --name mysql8.0 \
-v /docker/xxx2.0/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /docker/xxx2.0/mysql/conf/conf.d:/etc/mysql/conf.d \
-v /docker/xxx2.0/mysql/logs:/var/log/mysql \
-v /docker/xxx2.0/mysql/data:/usr/mysql/data \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 52100:3306 \
-d mysql:8.0.16

上面命令执行时会报错:

ERROR: mysqld failed while attempting to check config command was: "mysqld --verbose --help" mysqld: Error on realpath() on '/var/lib/mysql-files' (Error 2 - No such file or directory) 2024-10-15T08:21:25.321756Z 0 [ERROR] [MY-010095] [Server] Failed to access directory for --secure-file-priv. Please make sure that directory exists and is accessible by MySQL Server. Supplied value : /var/lib/mysql-files 2024-10-15T08:21:25.325290Z 0 [ERROR] [MY-010119] [Server] Aborting

这个错误通常是由于 MySQL 8 的安全文件权限(secure-file-priv)配置导致的问题。MySQL 8 强制要求指定的目录存在且可访问,否则会导致启动失败。
挂载文件方式也有问题,修改如下:

docker run --name mysql8.0 \
-v /docker/xxx2.0/mysql/config:/etc/mysql \
-v /docker/xxx2.0/mysql/mysql-files:/var/lib/mysql-files \
-v /docker/xxx2.0/mysql/logs:/var/log/mysql \
-v /docker/xxx2.0/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=arc123456 \
-p 52100:3306 \
-d mysql:8.0.16

2. 创建nacos2.1.1容器

docker run --name srt2-nacos \
-p 7848:7848 \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
-v /docker/srt2.0/nacos/conf:/home/nacos/conf \
-v /docker/srt2.0/nacos/logs:/home/nacos/logs \
-d nacos/nacos-server:v2.1.1

nacos配置文件conf/application.properties

# 填自己的ip地址,本地填127.0.0.1就行
nacos.inetutils.ip-address=127.0.0.1

spring.datasource.platform=mysql
db.num=1
#填自己的数据库连接和密码
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root

nacos容器有时候启动失败:java.lang.IllegalStateException: No DataSource set

  • 数据库使用的是mysql8.0,原因很可能是时区问题,默认配置时区是UTC,修改为:Asia/Shanghai,启动正常
    上面配置修改后,又一次停机重启nacos时,又出现报错:No DataSource set
  • 解决办法:在JDBC连接url上设置参数allowPublicKeyRetrieval=true ,启动后正常
    nacos和mysql8连接错误时好时坏,也是折磨人,下面是nacos的最终配置:

    ### Connect URL of DB:
    db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true

    3. 创建neo4j容器

    docker run --name neo4j-container \
    -p 52102:7474 \
    -p 52103:7687 \
    -v /docker/srt2.0/neo4j/data:/data \
    -v /docker/srt2.0/neo4j/logs:/logs \
    -v /docker/srt2.0/neo4j/import:/var/lib/neo4j/import \
    -v /docker/srt2.0/neo4j/plugins:/plugins \
    -v /docker/srt2.0/neo4j/conf:/conf \
    -e NEO4J_AUTH=neo4j/123456 \
    -d neo4j:3.5.3

    1. mysql8

    docker run --name mysql8 \
    -v $(pwd)/data:/var/lib/mysql \
    -v $(pwd)/conf.d:/etc/mysql/conf.d \
    -v $(pwd)/logs:/var/log/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -p 10300:3306 \
    -d mysql:8.0

    2. redis

    docker run --name redis \
      -v $(pwd)/conf/redis.cnf:/usr/local/etc/redis/redis.cnf \
      -v $(pwd)/data:/data \
      -p 10301:6379 \
      -d redis:latest \
      redis-server /usr/local/etc/redis/redis.cnf

    3. nginx

    docker run --name nginx \
    -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf \
    -v $(pwd)/conf.d:/etc/nginx/conf.d \
    -v $(pwd)/logs/:/var/log/nginx \
    -v $(pwd)/html/:/var/www/html \
    -e TZ=\"Asia/Shanghai\" \
    -p 10000:80 \
    -p 10001:81 \
    -d nginx:latest

    4. gb-corp

    docker run --name gb-corp \
        -v $(pwd)/app/corp.jar:/app/corp.jar \
        -v $(pwd)/logs/:/logs \
        -v $(pwd)/files/:/files \
        -p 10200:8080 \
        -e JAVA_OPTS="${JAVA_OPTS} -Dspring.profiles.active=test" \
        --network greenbook \
        -d springboot:v6

    5. jenkins

    docker run --name jenkins \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /usr/bin/docker:/usr/bin/docker \
    -v $(pwd)/jenkins/jenkins_home:/var/jenkins_home \
    -v $(pwd)/jenkins/jdk1.8:/opt/jdk1.8 \
    -v $(pwd)/jenkins/apache-maven-3.8.8:/opt/apache-maven-3.8.8 \
    -v $(pwd)/jenkins/repository:/opt/repository \
    -v /data/docker:/data \
    -p 10010:8080 \
    -d jenkins/jenkins:latest

    1.数据库容器

    docker中用户权限配置
    非root用户创建目录或文件时,需要提权sudo,这样操作后文件的用户拥有者和所属组均属于root,会造成docker访问的权限问题。
    解决办法是,将文件所属组修改为docker组,例如:

    sudo chown root:docker /etc/docker/daemon.json

    为了确保docker组的用户可以访问该文件,需要设置适当的文件权限:

    # 拥有者`root`可以读取和写入该文件,`docker`组的用户可以读取该文件,其他用户无法访问
    sudo chmod 640 /etc/docker/daemon.json

    1.1 postgres容器

    #镜像拉取
    docker pull postgres:12.13
    # 创建容器
    docker run --name postgres12.13 \
    -e POSTGRES_PASSWORD=123456 \
    -e TZ=Asia/Shanghai \
    -e POSTGRES_INITDB_ARGS="--encoding=UTF-8 --locale=en_US.utf8" \
    -v /docker/postgres12.13/data/:/var/lib/postgresql/data \
    -p 5432:5432 \
    -d postgres:12.13

    启动postgresql时docker启动失败,查看日志

    [root@s73 ~]# docker logs pg12.13
    ls: cannot access '/docker-entrypoint-initdb.d/': Operation not permitted

好像是权限的问题,问题解决,在docker run时额外加上参数 –privileged问题解决
官网的解释是给容器额外的权限,看来还是权限不足的问题引起的

docker run --privileged --name postgres12.13 \
    -e POSTGRES_PASSWORD=123456 \
    -e TZ=Asia/Shanghai \
    -e POSTGRES_INITDB_ARGS="--encoding=UTF-8 --locale=en_US.utf8" \
    -v /docker/postgres12.13/data/:/var/lib/postgresql/data \
    -p 5432:5432 \
    -d postgres:12.13

1.2 mysql容器

#镜像拉取
docker pull mysql:8.0
# 创建一个mysql临时容器,关闭后自动销毁
docker run --name temp-mysql8 --rm -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
docker cp temp-mysql8:/etc/mysql/my.cnf /data/docker/mysql8.0/conf
docker cp temp-mysql8:/etc/mysql/conf.d/docker.cnf /data/docker/mysql8/conf.d
docker cp temp-mysql8:/etc/mysql/conf.d/mysql.cnf /data/docker/mysql8/conf.d
# 创建容器
docker run --name mysql8.0.40 \
-v /data/docker/mysql8.0/data:/var/lib/mysql \
-v /data/docker/mysql8.0/conf.d:/etc/mysql/conf.d \
-v /data/docker/mysql8.0/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci \
-d mysql:8.0
  • mysql区分大小写设置:lower_case_table_names
    如果设置为 0,表名将按指定方式存储,并且在对比表名时区分大小写。
    如果设置为 1,表名将以小写形式存储在磁盘上,在对比表名时不区分大小写。
    如果设置为 2,则表名按给定格式存储,但以小写形式进行比较。
  • 在 MySQL 8 中,数据目录初始化之后,不再允许更改 lower_case_table_names = 1 的 值;
    如果要修改必须重新初始化数据库,即清空数据目录,重启数据库

    mysql8.0在docker环境下的配置文件为/etc/mysql/conf.d/docker.cnf,内容如下:

    [mysqld]
    host_cache_size=0
    skip-name-resolve
    lower_case_table_names = 0

    修改没起作用,还需要考虑容器启动时增加:--lower_case_table_names = 1

    docker run --name mysql8 \
    -v $(pwd)/data:/var/lib/mysql \
    -v $(pwd)/conf.d:/etc/mysql/conf.d \
    -v $(pwd)/logs:/var/log/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -p 10300:3306 \
    -d mysql:8.0

    conf/my.cnf

    
    [mysqld]
    pid-file        = /var/run/mysqld/mysqld.pid
    socket          = /var/run/mysqld/mysqld.sock
    datadir         = /var/lib/mysql
    secure-file-priv= NULL

Custom config should go here

!includedir /etc/mysql/conf.d/

conf.d/mysql.cnf

[mysql]

[mysqld]
default-time-zone = '+8:00'

character-set-server = utf8mb4
collation-server = utf8mb4_general_ci

大小写敏感

lower_case_table_names = 1

conf.d/docker.cnf

[mysqld]
skip-host-cache
skip-name-resolve


### 2. nacos容器
```shell
# 镜像拉取
docker pull nacos-2.1.1
# 创建容器
docker run --name nacos-2.1.1 \
-p 7848:7848 \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
-v /path/arcdocker/nacos2.1.1/:/home/nacos/ \
-d nacos/nacos-server:v2.1.1

3.SeaTunnel

3.1 镜像制作

使用wget下载SeaTunnel,使用-O参数将文件命名为apache-seatunnel-2.3.7.tar.gz

wget https://dlcdn.apache.org/seatunnel/2.3.7/apache-seatunnel-2.3.7-bin.tar.gz -O apache-seatunnel-2.3.7.tar.gz

解压下载好的文件到当前目录

tar -zxvf apache-seatunnel-2.3.7.tar.gz -C .

安装插件并将文件重新打包压缩

sh bin/install-plugin.sh 2.3.7
tar -czvf  apache-seatunnel-2.3.7-bin.tar.gz  apache-seatunnel-2.3.7

创建Dockerfile

FROM openjdk:8

ENV SEATUNNEL_VERSION="2.3.7"
COPY apache-seatunnel-${SEATUNNEL_VERSION}-bin.tar.gz /opt/apache-seatunnel-${SEATUNNEL_VERSION}-bin.tar.gz
WORKDIR /opt
RUN tar -xzvf apache-seatunnel-${SEATUNNEL_VERSION}-bin.tar.gz
RUN mv apache-seatunnel-${SEATUNNEL_VERSION} seatunnel
RUN rm -f /opt/apache-seatunnel-${SEATUNNEL_VERSION}-bin.tar.gz
WORKDIR /opt/seatunnel
ENTRYPOINT ["sh","-c"," bin/seatunnel.sh --config $config  -e local"]

制作镜像

docker build -t seatunnel:2.3.7 -f Dockerfile .

3.2 运行容器

docker run -e config="/data/seatunnel.streaming.conf" -v /data/apache-seatunnel-2.3.3/config/v2.streaming.conf.template:/data/seatunnel.streaming.conf  -d  seatunnel:test

4. nginx容器

5. jenkins容器

使用最近版本,使用支持java8的版本时,插件安装总是出错】

docker pull jenkins/jenkins

docker run --name jenkins \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v $(pwd)/jenkins/jenkins_home:/var/jenkins_home \
-v $(pwd)/jenkins/jdk1.8:/opt/jdk1.8 \
-v $(pwd)/jenkins/apache-maven-3.8.8:/opt/apache-maven-3.8.8 \
-v $(pwd)/jenkins/repository:/opt/repository \
-v /data/docker:/data \
-p 10010:8080 \
-d jenkins/jenkins:latest

挂载目录时会出现权限错误:

5.1. 确定Docker容器用户ID

首先,你需要确定Docker容器中的用户ID。通常,官方Jenkins镜像使用jenkins用户,其ID为1000。你可以通过以下命令运行一个临时的Jenkins容器来确认用户ID:

docker run --rm -it jenkins/jenkins:lts id jenkins

这将输出类似如下信息:

uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins)

5.2. 修改宿主机上的目录权限100

假设你要为路径 /path/to/jenkins_home 添加写入权限,可以使用 chownchmod 命令:

sudo chown -R 1000:1000 /path/to/jenkins_home

挂载宿主机数据目录时仍然会出现权限错误
这时不方便更改文件所有者时
使用setfacl命令:在宿主机上运行以下命令,将Jenkins用户(UID 1000)的写权限添加到目标目录:

sudo setfacl -R -m u:1000:rwx /path/to/data

5.3 执行docker命令

如果jenkins中执行宿主机命令时,会提示权限不足,利用docker容器的和宿主机的用户组是相互映射的,可以在Jenkins容器中创建docker用户组,将jenkins用户加入docker组来解决权限问题。

# 1. 宿主机查看docker用户组(安装docker时会自动创建)
cat /etc/group|grep docker
# 输出
docker:x:994:
# 2. 以root用户身份进入Jenkins容器
docker exec -it -u root jenkins bash
# 3. 创建一个新的用户组,使用宿主机中docker用户组的id:994
groupadd -g 994 docker
# 4. 将jenkins容器用户jenkins加入新建的用户组
usermod -aG docker jenkins
# 5. 重启jenkins容器
docker restart jenkins

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注