docker
# 1. docker的思想
集装箱:会将所有需要的内容放到不同的集装箱中,谁需要这些环境就直接去拿 标准化:运输标准化,命令标准化,rancher 隔离性:单独空间
一款产品:开发--上线 两套环境!应用环境,应用配置! 开发--运维。问题:环境不一致导致程序异常 环境配置十分麻烦,费时费力 传统:开发jar,运维来做打包 现在:开发打包部署上线,一套流程做完
repository,repo tag 标签 nginx:latest
镜像:静态 容器:动态,生命周期
images,containers,networks,volumes,plugins
镜像地址 https://c.163yun.com/hub http://hub.daocloud.io
# 1.1 namespaces资源隔离
PID 进程编号 net 网络设备,网络协议栈,端口等 IPC 信号量,消息队列,共享内存 MOUNT 文件系统,挂载点 UTS 主机名和主机域 USER 操作进程的用户和用户组
主机级虚拟化 pve,esxi,kvm
缺点: 1、资源占用多 2、冗余步骤多 3、启动慢
虚拟出一套硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
容器级虚拟化 docker lxc
容器的应用直接运行在宿主机的内容,没有虚拟硬件和内核 容器间互相隔离,每个容器内都有一个属于自己的文件系统,互不影响。
应用更快速的交付和部署 更便捷的升级和扩缩容 更简单的系统运维 更高效的计算资源利用
# 1.2 control groups
blkio:块设备IO cpu cpuacct:CPU资源使用报告 cpuset:多处理器平台上的CPU集合 devices: 设备访问 freezer: 挂起或恢复任务 memory:内存用量及报告 perf_event:对cgroup中的任务进行统一性能测试 net_cls:cgroup中的任务创建的数据报文的类别标识符
docker分层构建,零和挂载
nmp machine+swarm+compose mesos+marathon kubernetes -> k8s libcontainer
# 1.3 Docker镜像加载原理
UnionFS 联合文件系统 分层,轻量级并且高性能的文件系统 一次同时加载多个文件系统,但从外面看起来,只看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
bootfs和rootfs bootfs启动很慢 主要是包含bootloader和kernel,bootloader主要是引导加载kernel 容器只用rootfs,内核是用宿主机
# 2. 安装/升级Docker客户端
yum -y install yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast yum -y install docker-ce
推荐安装1.10.0以上版本的Docker客户端,参考文档 docker-ce \2. 配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
mkdir -p /etc/docker
cat >/etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://ap7lrs1j.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker && systemctl enable docker
{
"registry-mirrors":["https://registry.docker-cn.com"],
"insecure-registries":["ip:port"]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
快速安装Docker
curl https://releases.rancher.com/install-docker/20.10.sh | sh
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh
systemctl restart docker
2
3
# 3. 基础命令
docker info
docker images 显示镜像列表
docker rmi nginx:latest 镜像删除
docker pull nginx 仓库下载
docker run 容器创建启动
docker start/stop 容器启动停止
docker ps -a 显示容器列表
docker rm -f wordpress 强制删除
docker ps -a -q
docker rm -f $(docker ps -a q)
docker ps --no-trunc 查看
docker stop/start CONTAINERID
docker stop/start nginx 启动停止容器
docker stats nginx 查看容器状态
docker inspect nginx 查看容器所有基本信息
docker exec -it nginx /bin/bash 登录容器的bash
docker logs nginx 查看容器日志
docker logs -tf --tail 10 nginx docker exec 容器名 容器内执行的命令 docker history grafana/grafana:7.5.9 查看构建的命令
将宿主机的文件复制到容器内部的指定目录 docker cp 文件名称 容器id:容器内部路径
docker cp /opt/software/temp/test/test.txt 688e83c55129:/test/ docker cp 688e83c55129:/test/test.txt /opt/software/temp/test/
docker run
--restart=always 容器的自动启动
-h x.xx.xx 设置容器主机名
--dns xx.xx.xx.xx 设置容器使用的DNS服务器
--dns-search DNS搜索设置
--add-host hostname:IP 注入hostname IP解析
--rm 服务停止时自动删除
volumes目录清理
docker volume rm $(docker volume ls -qf dangling=true)
docker -d 代表后台运行容器
-p 指定映射端口
--name 容器名称
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识|镜像名称[:tag]
如果已经启动了则可以使用如下命令:
docker update --restart=always <CONTAINER ID>
docker update --restart=always nginx 更新为开机启动
2
centos 镜像
hub.c.163.com/public/centos:6.7-tools
docker run --name mysql -d hub.c.163.com/public/centos:6.7-tools
docker run --name tomcat -d -p 8800:8080 hub.c.163.com/library/tomcat
docker pull wordpress docker pull mariadb docker run --name db --env MYSQL_ROOT_PASSWORD=opersdev -d mariadb docker run --name MyWordPress --link db:mysql -p 8080:80 -d wordpress
后台启动容器 docker run -d centos 问题:docker
可视化 portainer rancher (CI/CD)
docker run -d -p 9000:9000 --restart=always --name portainer -v /var/run/docker.sock:/var/run/docker.sock portainer
开启远程连接docker连接2375 \1. 编辑docker.service vim /usr/lib/systemd/system/docker.service 找到 ExecStart字段修改如下 ExecStart=/usr/bin/dockerd-current -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
\2. 重启docker重新读取配置文件,重新启动docker服务 systemctl daemon-reload systemctl restart docker
# 4. 容器转换为镜像
docker commit mysql mysql:5.1
基于容器制作:
docker commit
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
--author, -a
--pause, -p
--message, -m
--change, -c
将制作好的镜像打成 tar 包 docker save -o tar包的名字 镜像名
导入镜像 docker load -i tomcat.image
更改镜像名字 docker tag 镜像ID tomcat:8.5
docker commit -m '镜像描述' -a '制作者' 容器名 镜像名
(1)容器中运行多个守护进程时,前面的进程要用后台方式运行(或添加 &),否则后面的服务无法启动
(2)容器中最后一个守护进程一定要用前台方式运行,否则start.sh退出,容器退出,所有的服务就白启动了
# 5. 部署ssm工程
修改SSM工程环境,设置为Linux中Docker容器的信息
通过Maven的package重新打成war包 将Windows下的war包复制到Linux中 通过docker命令将宿主机的war包复制到容器内部
docker cp 文件名称 容器id:容器内部路径
测试访问SSM工程
# 6. 数据卷
创建数据卷
docker volume create 数据卷名称
\#创建数据卷后,默认会存放在一个目录下/var/lib/docker/volumes/数据卷名称/_data
查看全部数据卷
dcoker volume ls
查看数据卷详情
docker volume inspect 数据卷名称
删除数据卷
docker volume rm 数据卷名称
容器映射数据卷
docker run -d -p 8080:8080 --name tomcat -v 数据卷名称:窗口内部的路径 镜像ID
docker run -d -p 8080:8080 --name tomcat -v 路径:容器内部的路径 镜像ID
docker rm -fv tomcat --volumes-from 数据共享和容器自己的产生的data
# 6.1 具名和匿名挂载
匿名挂载 -v 容器内路径 只写容器内路径,挂载到/var/lib/docker目录
具名挂载 -v 卷名:容器内路径 docker volume inspect 数据卷名称
所有docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data
# 7. dockerfile自定义镜像
dockerfile 是一种被docker程序解释的脚本
底层镜像
https://hub.docker.com/_/alpine
转换命令
docker build -t wangyang/jdk-tomcat
# 7.1 Dockerfile 命令
1、FROM(指定基础 image): 构建指令,必须指定且需要在 Dockerfile 其他指令的前面。后续的指令都依赖于该指令指定的image。 FROM 指令指定的基础 image 可以是官方远程仓库中的,也可以位于本地仓库 example: FROM centos:7.2 FROM centos
2、MAINTAINER(用来指定镜像创建者信息):
构建指令,用于将image 的制作者相关的信息写入到image 中。当我们对该image 执行docker inspect 命令时,输出中有相应的字段记录该信息。 example: MAINTAINER wangyang "wangyang@itxdl.cn"
3、RUN(安装软件用): 构建指令,RUN 可以运行任何被基础image 支持的命令。如基础image 选择了Centos,那么软件管理 部分只能使用Centos 的包管理命令 example: RUN cd /tmp && curl -L 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz' | tar -xz RUN ["/bin/bash", "-c", "echo hello"]
4、CMD(设置container 启动时执行的操作): 设置指令,用于container 启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。 该指令只能在文件中存在一次,如果有多个,则只执行最后一条 example: CMD echo “Hello, World!”
5、ENTRYPOINT(设置container 启动时执行的操作): 设置指令,指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效。 example: ENTRYPOINT ls -l #该指令的使用分为两种情况,一种是独自使用,另一种和CMD 指令配合使用。当独自使用时,如果 你还使用了CMD 命令且CMD 是一个完整的可执行的命令,那么CMD 指令和ENTRYPOINT 会互相 覆盖只有最后一个CMD 或者ENTRYPOINT 有效 # CMD 指令将不会被执行,只有ENTRYPOINT 指令被执行 CMD echo “Hello, World!” ENTRYPOINT ls -l #另一种用法和CMD 指令配合使用来指定ENTRYPOINT 的默认参数,这时CMD 指令不是一个完整 的可执行命令,仅仅是参数部分;ENTRYPOINT 指令只能使用JSON 方式指定执行命令,而不能指定 参数 FROM ubuntu CMD ["-l"] ENTRYPOINT ["/usr/bin/ls"]
6、USER(设置container 容器的用户): 设置指令,设置启动容器的用户,默认是root 用户 example: USER daemon = ENTRYPOINT ["memcached", "-u", "daemon"]
7、EXPOSE(指定容器需要映射到宿主机器的端口):设置指令,该指令会将容器中的端口映射成宿 主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的IP 地址而是使用宿主机器的IP 地址和映射后的端口。要完成整个操作需要两个步骤,首先在Dockerfile 使用EXPOSE 设置需要映射 的容器端口,然后在运行容器的时候指定-p 选项加上EXPOSE 设置的端口,这样EXPOSE 设置的端 口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时要 确保宿主机器上的端口号没有被使用。EXPOSE 指令可以一次设置多个端口号,相应的运行容器的时 候,可以配套的多次使用-p 选项。 example: 映射一个端口 EXPOSE 22 相应的运行容器使用的命令 docker run -p port1 image 映射多个端口 EXPOSE port1 port2 port3 相应的运行容器使用的命令 docker run -p port1 -p port2 -p port3 image 还可以指定需要映射到宿主机器上的某个端口号 docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image
8、ENV(用于设置环境变量):构建指令,在image 中设置一个环境变量 example: 设置了后,后续的RUN 命令都可以使用,container 启动后,可以通过docker inspect 查看这个环 境变量,也可以通过在docker run --env key=value 时设置或修改环境变量。假如你安装了JAVA 程序, 需要设置JAVA_HOME,那么可以在Dockerfile 中这样写: ENV JAVA_HOME /path/to/java/dirent
9、ADD(从src 复制文件到container 的dest 路径) example: ADD src dest src 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的 文件url; dest 是container 中的绝对路径
10、COPY (从src 复制文件到container 的dest 路径) example: COPY src dest 11、VOLUME(指定挂载点): 设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共 享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后, 所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile 中使用该指令 examp: FROM base VOLUME ["/tmp/data"]
12、WORKDIR(切换目录):设置指令,可以多次切换(相当于cd 命令),对RUN,CMD,ENTRYPOINT 生效 example: WORKDIR /p1 WORKDIR p2 RUN vim a.txt
13、ONBUILD(在子镜像中执行):ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子 镜像中执行 example: ONBUILD ADD . /app/src ONBUILD RUN /usr/local/bin/python-build --dir /app/src
# 7.2 编写Dockerfile文件
FROM hub.c.163.com/public/centos:6.7-tools
MAINTAINER 541885811@qq.com
ADD ./apache-tomcat-9.0.37.tar.gz /root
ADD ./jdk-8u211-linux-x64.tar.gz /root
ENV JAVA_HOME /root/jdk1.8.0_211
ENV PATH $JAVA_HOME/bin:$PATH
RUN export JAVA_HOME=/root/jdk1.8.0_211
RUN export JRE_HOME=$JAVA_HOME/jre
EXPOSE 8080
ENTRYPOINT /root/apache-tomcat-9.0.37/bin/startup.sh && tailf /root/apache-tomcat-9.0.37/logs/catalina.out
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker build -t tomcat:v1.0 . Dockerfile 不能超过128层
通过dockerfile修改账号密码: RUN echo "ming:xxxxx" | chpasswd echo "admin:adminlt" | chpasswd
构建镜像 docker build -t nginx:v3 .
Dockfile
FROM centos-nfjt VOLUME /opt EXPOSE 80 ENTRYPOINT ["nfjt-start.sh"]
# 8. docker-compose容器编排
https://docs.docker.com/compose
docker-compose 来轻松高效的管理容器。定义运行多个容器
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
2
在任意目录下输入docker-compose
yml文件以key:value方式来指定配置信息 多个配置信息以换行+缩进的方式来区分 在docker-compose.yml文件中,不要使用制表符
# 8.1 docker-compose模板
version: "3.9"
services:
db:
image: mysql:5.7
networks:
- net10
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
networks:
- net10
volumes:
- wordpress_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpressvolumes:
db_data: {}
wordpress_data: {}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 8.2 python应用
https://docs.docker.com/compose/gettingstarted/
停止 docker-compose down
默认的服务名 文件名_服务名_num 多个服务器,集群,_num 为了避免冲突
学习,要掌握规律 只要多写,多看。compose.yaml配置 官方文档 https://docs.docker.com/compose/compose-file/compose-file-v3/
# 8.3 构建项目实战
1、编写项目 2、dockerfile构建镜像 3、docker-compose.yaml编排项目 4、docker-compose up
# 9. docker 仓库构建
官方仓库构建 Harbor 构建
# 9.1 仓库服务器配置:
docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always registry
vim /etc/docker/daemon.json { "insecure-registries": ["192.168.200.236:5000"] }
docker tag tomcat:v1.0 192.168.200.236:5000/tomcat:v1.0 docker push 192.168.200.236:5000/tomcat:v1.0
# 9.2 客户机设置:
vim /etc/docker/daemon.json { "insecure-registries": ["192.168.200.236:5000"] } curl -XGET http://192.168.200.236:5000/v2/_catalog 查看已有镜像
docker pull 192.168.200.236:5000/tomcat:v1.0
# 9.3 Harbor仓库构建
tar xf harbor-offline-installer-v1.10.5.tgz
mv harbor /usr/local/
cd /usr/local/harbor/
openssl genrsa -des3 -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
mkdir /opt/cert
chmod -R 755 /opt/cert
mv server.* /opt/cert
vim harbor.yml
./install.sh
vim /etc/docker/daemon.json
systemctl restart docker
docker tag tomcat:v1.0 hub.xnuo.top/xiaonuo/tomcat:v1.0
docker push hub.xnuo.top/xiaonuo/tomcat:v1.0
docker login hub.xnuo.top
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 9.4 上传到hub.docker.com
docker login -t opersdev docker tag mycentos:0.1 opersdev/mycentos docker push opersdev/mycentos
# 10. 网络管理
docker中的所有的网络接口都是虚拟的 docker使用网桥和NAT的方式
通过--link来解决连接问题 --link本质探究 不建议使用--link
docker0问题:他不支持容器名连接访问
容器访问外部网络 iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -o docker0 -j MASQUERADE
外部网络访问容器 iptables -t nat -A PREROUTING -m addrtype -dst-type LOCAL -j DOCKER iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp -dport 80 -j DNAT --to-destination 172.17.0.2:80
进程修改 -b --bridge="" 默认是docker0 --bip 指定docker0的IP地址 --dns 配置容器的DNS
容器修改 --dns 用于指定容器的DNS --net 用于指定容器的网络方式 bridge none 用于不需要网络的容器 container 使用其它容器的网络交换机 host 表示容器使用HOST的网络,端口全部开放,不安全
端口的暴露方式 -p :80 将容器端口映射至主机的动态端口 -p 8080:80 映射至指定端口 -p IP::80 映射至指定的主机的IP的动态端口 -p IP:8080:80 映射到指定主机的指定端口 -P 暴露所需要的所有端口
docker port nginx 查看映射的端口
docker网络隔离
docker network ls
docker network create -d 类型 网络空间名称
类型分为: overlay network
bridge network
安装pipework
创建自定义网络 docker network create --driver bridge --subnet 192.168.0.1/24 --gateway 192.168.0.1 mynet docker network inspect mynet
docker run -d -P --name tomcat-net-01 --net mynet tomcat
自定义网络默认能通过名称互相ping通
mysql和redis- 不同的网络创建不同的集群,保证集群是安全和健康的
网络连通的操作 docker network connect mynet tomcat01 相当于在tomcat01加了一块网卡用来接在mynet虚拟交换机下面
redis集群创建
docker network create --driver bridge --subnet 172.20.0.0/16 --gateway 172.20.0.1 redis
for port in $(seq 1 6);
do
mkdir -p /mydata/redis/node-${port}/conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.20.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# docker修改容器网络模式
一、创建容器时指定网终模式
docker run -d -p 外部访问端口:容器内端口 --net="网络模式" -v 本机目录:容器内目录 --name="容器名称" 镜像名 要执行的角本
docker ps 查看启动的容器列表
docker ps -a 查看所有的容器列表
docker start 容器名称 启动容器
docker restart 容器名称 重启容器
docker stop 容器名称 停止容器
二、已经存在的容器修改网终模式
1.找到容器的hostconfig.json文件
find / -name hostconfig.json
/var/lib/docker/containers/a77c1xxx/hostconfig.json
/var/lib/docker/containers/cdaccxxx/hostconfig.json
/var/lib/docker/containers/1cdd6dxxx/hostconfig.json
/var/lib/docker/containers/15c3bcfxxx/hostconfig.json
修改配置
vi /var/lib/docker/containers/a77c1xxx/hostconfig.json
"NetworkMode":"bridge"
为你想要的 模式
如
"NetworkMode":"host"
当为host时或不做端口印射时"PortBindings": {},可以为空对象
修改端口绑定
"PortBindings":{
"3306/tcp": [{ //内部端口
"HostIp": "",
"HostPort": "3309" 外部访问端口
}]
}
重启容器
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
容器互访的三种方式
方式一、虚拟IP访问
方式二、link
方式三、创建自定义bridge,通过容器名称访问
docker run -it --name <容器名> ---network <bridge> --network-alias <网络别名> <镜像名>
https://blog.csdn.net/weixin_41896265/article/details/108245264
# 11. 内存限制
为应用做内存压力测试,理解正常业务需求下使用的内存情况,然后才能进入生产环境使用 一定要限制容器的内存使用上限 尽量保证主机的资源充足,一旦通过监控发现资源不足,就进行扩容或者对容器进行迁移 如果可以,尽量不要使用swap,swap的使用会导致内存计算复杂,对调度器非常不友好
-m --memory 内存大小,最小4M --memory-swap swap大小 --memory-swappiness --memory-reservation 浮动内存 -kernel-memory 内核内存,最小值为4M --oom-kill-disable 是否运行OOM的时候杀死容器
# 12. CPU资源限制
--cpuset-cpus="" 允许使用的CPU集,值 可以为0-3,0,1 -c,--cpu-chares=0 CPU共享权重,默认值1024 --cpuset-mems="" 允许在上执行的内存节点 --cpu-period=0 --cpu-quota=0 --cpus
example
docker run -it --cpu-period=50000 --cpu-quota=25000 ubuntu /bin/bash
docker run --name stress -it --rm -m 256m lorel/docker-stress-ng:latest stress -vm 2
docker run --name stress -it --rm --cpus 2 lorel/docker-stress-ng:latest stress --cpu 8
docker run --name stress -it --rm --cpuset-cpus 0 lorel/docker-stress-ng:latest stress --cpu 8
# 13. 应用部署模板
docker run --name jms_all -d \
-v /opt/jumpserver/data:/opt/jumpserver/data \
-p 8088:80 \
-p 2222:2222 \
-e SECRET_KEY=W5Ic3fMXNZ0p5RIy5DhJYJllppTfcfkW8Yuf94VBMfpcssbfu \
-e BOOTSTRAP_TOKEN=QEkNEMYmCQj0BdcH \
-e DB_HOST=192.168.10.230 \
-e DB_PORT=3306 \
-e DB_USER=jumpserver \
-e DB_PASSWORD=opersdev \
-e DB_NAME=jumpserver \
-e REDIS_HOST=192.168.10.232 \
-e REDIS_PORT=6379 \
-e REDIS_PASSWORD=123456 \
--privileged=true \
jumpserver/jms_all:v2.5.3
mkdir -p /www/zentaopms /www/mysqldata
docker pull easysoft/zentao:12.4.3
sudo docker network create --subnet=172.172.172.0/24 zentaonet
sudo docker run --name zentao -p 8080:80 --network=zentaonet --ip 172.172.172.172 --mac-address 02:42:ac:11:00:00 -v /www/zentaopms:/www/zentaopms -v /www/mysqldata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d easysoft/zentao:12.4.3
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 14.docker hub 上传
登录 docker login
更改镜像名称 docker tag zdir opersdev/zdir
上传 docker push opersdev/zdir
docker login -u admin pan.xnuo.top:8082
# 15. docker报错
最近在使用docker 构建centos7 容器时,发现无法使用systemctl 命令。后来万能的百度解决了问题,随记之以备后用。
解决办法:
docker run --privileged -it -d centos:7.6.1810 /usr/sbin/init #注意2点:1. --privileged 参数必须加,2. /usr/sbin/init作为容器的启动命令 验证方法:
docker exec -it $containerID bash #进入容器的bash命令行 systemctl #验证systemctl 命令是否可用
# 16.关于容器内应用真实IP获取
# nginx
nginx 获取到的$remote_addr
是代理服务器 IP ,因此 X-Real-IP
并不是用户的 IP。 nginx 要把请求转发给后台服务程序,因此我们需要加上这样一行配置:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 关于运行在Docker内的Nginx获取不到真实用户IP这件事
https://www.moyufangge.com/2020-12/docker-real-ip/
# 绑定Dokcer容器到主机指定网卡的方法
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" docker1
iptables -t nat -I POSTROUTING -p all -s 172.18.0.0/16 -j SNAT --to-source 10.0.0.100
2
3