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
添加写入权限,可以使用 chown
和 chmod
命令:
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