1 通用
1.1 权限
开启挂载目录权限
#开启目录权限
chmod a+rwx /usr/local/test
#开启docker挂载权限
chmod a+rw /var/run/docker.sock
所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxx/_data
1.2 可视化
- portainer(先用这个)
- Rancher(CI/CD再用)
什么是portainer?
Docker图形化界面管理工具!提供一个后台面板供我们操作
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
# 测试
http://42.192.168.139:8088/
平时不适用,可以测试玩玩、
学习参考:
https://www.bilibili.com/video/BV1og4y1q7M4
2 部署nginx
[root@vitloud home]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 16148 [OK]
# 下载
docker pull nginx
# 运行测试
# -d: 后台运行
# -name: 给容器命名
# -p: 宿主机端口:容器内部端口
# -v: /宿主机路径:容器内路径
docker run -d \
-v cnginx:/etc/nginx \
-p 3344:80 \
--name vitcloud-nginx nginx
# 测试
curl localhost:3344
# 进入容器nginx01
[root@vitloud home]# docker exec -it nginx01 /bin/bash
# 查找nginx配置路径
root@e7979f326715:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx

思考问题:我们每次改动nginx配置文件,都需要进入容器内部?十分麻烦,我要是可以在容器外部提供一个映射路径,达到在容器修改文件名,容器就可以自动修改?-v 数据卷
3 部署tomcat
# 官方的使用
docker run -it --rm tomcat:9.0
# 我们之前的启动都是后台,停止了容器之后,容器还是可以查到 docker run -it rm. 一般用来测试,用完删除
# 下载再启动
docker pull tomcat
# 启动运行
# 访问地址:域名:3355
docker run -d -p 3355:8080 -name tomcate01 tomcat
# 进入容器
[root@vitloud home]# docker exec -it tomcate01 /bin/bash
# 部署网站
cd /usr/local/tomcat/webapps
cp -r webapps.dist/* webapps
# 发现问题:1、linux命令少了,2、没有webapps,阿里云镜像的原因,默认是最小镜像,所有不必要的都剔除掉
思考问题:我们以后部署项目,如果每次都要进入容器是不是十分麻烦?我要是可以在容器外部提供一个映射路径,webapps我们在外部放置项目,就自动同步到内部就好了。
4 部署MySQL
docker pull mysql:5.7
docker run -d \
-p 3310:3306 \
-v /home/mysql/conf:/etc/mysql/conf.d \
-v /home/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
--name mysql01 mysql:5.7
可以通过Navicat连接测试
删除容器 数据也在
5 实战:部署Redis集群
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wIDQub8X-1643381954752)(image-20220121230315954.png)]
5.1 配置网卡
# 创建网卡
docker network create redis --subnet 172.38.0.0/16
# 查看网卡
docker network ls
5.1 通过脚本创建redis配置文件
for port in $(seq 1 6); \
do
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.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.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
5.3 启动 docker redis 容器
# -p: 端口映射 外部端口:内部端口
# -d: 后台运行
# --net: 使用redis网络
# -ip: 绑定ip
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
-v /mydata/redis/node-4/data:/data \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
-v /mydata/redis/node-5/data:/data \
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
5.4 进入容器并创建集群
# 进入容器
docker exec -it redis-1 /bin/sh
# 创建集群
# 集群切片:--cluster-plicas 1
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
5.5 连接测试
# -c: 集群
redis-cli -c
# 查看集群信息
127.0.0.1:6379> cluster info
# 查看集群节点
cluster nodes
set a b
-> Redirected to slot [15495] located at 172.38.0.13:6379
OK
# 模拟redis-3宕机 172.38.0.13
docker stop redis-3
使用dokcer后,所有的技术都会慢慢遍的简单
7 部署es+kibana
elasticsearch
es 暴露端口很多
es 十分耗内存
es的数据一般需要放置到安全目录!挂载
# --net somenetwork ? 网络配置
# 启动
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
# 会很卡
docker stats # 查看cpu的状态
# 赶紧关闭,在呢个价内存的限制,修改配置文件 -e 环境配置修改
# -e ES_JAVA_OPTS="-Xms64 -Xmx512m"
docker run -d --name elasticsearch01 --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
# 测试是否成功
curl localhost:9200
<h2><a id="1__0"></a>1 通用</h2>
<h3><a id="11__1"></a>1.1 权限</h3>
<p>开启挂载目录权限</p>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta">#</span><span class="language-bash">开启目录权限</span>
chmod a+rwx /usr/local/test
<span class="hljs-meta">
#</span><span class="language-bash">开启docker挂载权限</span>
chmod a+rw /var/run/docker.sock
</code></div></pre>
<p>所有的docker容器内的卷,没有指定目录的情况下都是在<code>/var/lib/docker/volumes/xxx/_data</code></p>
<h3><a id="12__12"></a>1.2 可视化</h3>
<ul>
<li>portainer(先用这个)</li>
<li>Rancher(CI/CD再用)</li>
</ul>
<p><strong>什么是portainer?</strong></p>
<p>Docker图形化界面管理工具!提供一个后台面板供我们操作</p>
<pre><div class="hljs"><code class="lang-shell">docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
<span class="hljs-meta">
# </span><span class="language-bash">测试</span>
http://42.192.168.139:8088/
</code></div></pre>
<p>平时不适用,可以测试玩玩、</p>
<p>学习参考:<br />
https://www.bilibili.com/video/BV1og4y1q7M4</p>
<h2><a id="2_nginx_35"></a>2 部署nginx</h2>
<pre><div class="hljs"><code class="lang-shell">[root@vitloud home]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 16148 [OK]
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta"># </span><span class="language-bash">下载</span>
docker pull nginx
<span class="hljs-meta">
# </span><span class="language-bash">运行测试</span>
<span class="hljs-meta"># </span><span class="language-bash">-d: 后台运行</span>
<span class="hljs-meta"># </span><span class="language-bash">-name: 给容器命名</span>
<span class="hljs-meta"># </span><span class="language-bash">-p: 宿主机端口:容器内部端口</span>
<span class="hljs-meta"># </span><span class="language-bash">-v: /宿主机路径:容器内路径</span>
docker run -d \
-v cnginx:/etc/nginx \
-p 3344:80 \
--name vitcloud-nginx nginx
<span class="hljs-meta">
# </span><span class="language-bash">测试</span>
curl localhost:3344
<span class="hljs-meta">
# </span><span class="language-bash">进入容器nginx01</span>
[root@vitloud home]# docker exec -it nginx01 /bin/bash
<span class="hljs-meta"># </span><span class="language-bash">查找nginx配置路径</span>
root@e7979f326715:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/4f4aacbd0baf6f62334925e747387a0d.png" alt="image.png" /></p>
<p>思考问题:我们每次改动nginx配置文件,都需要进入容器内部?十分麻烦,我要是可以在容器外部提供一个映射路径,达到在容器修改文件名,容器就可以自动修改?-v 数据卷</p>
<h2><a id="3_tomcat_76"></a>3 部署tomcat</h2>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta"># </span><span class="language-bash">官方的使用</span>
docker run -it --rm tomcat:9.0
<span class="hljs-meta">
# </span><span class="language-bash">我们之前的启动都是后台,停止了容器之后,容器还是可以查到 docker run -it <span class="hljs-built_in">rm</span>. 一般用来测试,用完删除</span>
<span class="hljs-meta">
# </span><span class="language-bash">下载再启动</span>
docker pull tomcat
<span class="hljs-meta">
# </span><span class="language-bash">启动运行</span>
<span class="hljs-meta"># </span><span class="language-bash">访问地址:域名:3355</span>
docker run -d -p 3355:8080 -name tomcate01 tomcat
<span class="hljs-meta">
# </span><span class="language-bash">进入容器</span>
[root@vitloud home]# docker exec -it tomcate01 /bin/bash
<span class="hljs-meta">
# </span><span class="language-bash">部署网站</span>
cd /usr/local/tomcat/webapps
cp -r webapps.dist/* webapps
<span class="hljs-meta">
# </span><span class="language-bash">发现问题:1、linux命令少了,2、没有webapps,阿里云镜像的原因,默认是最小镜像,所有不必要的都剔除掉</span>
</code></div></pre>
<p>思考问题:我们以后部署项目,如果每次都要进入容器是不是十分麻烦?我要是可以在容器外部提供一个映射路径,webapps我们在外部放置项目,就自动同步到内部就好了。</p>
<h2><a id="4_MySQL_103"></a>4 部署MySQL</h2>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment"># 后去镜像</span>
docker pull mysql:<span class="hljs-number">5.7</span>
<span class="hljs-comment"># 运行容器,需要做数据挂载!(需要配置密码)</span>
<span class="hljs-comment"># 官方测试</span>
<span class="hljs-comment"># docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag</span>
<span class="hljs-comment"># -d: 后台运行</span>
<span class="hljs-comment"># -p: 端口映射 暴露端口:容器端口</span>
<span class="hljs-comment"># -v: 卷挂载</span>
<span class="hljs-comment"># -e: 环境配置</span>
<span class="hljs-comment"># --name: 容器名字</span>
</code></div></pre>
<pre><div class="hljs"><code class="lang-powershell">docker run <span class="hljs-literal">-d</span> \
<span class="hljs-literal">-p</span> <span class="hljs-number">3310</span>:<span class="hljs-number">3306</span> \
<span class="hljs-literal">-v</span> /home/mysql/conf:/etc/mysql/conf.d \
<span class="hljs-literal">-v</span> /home/mysql/<span class="hljs-keyword">data</span>:/var/lib/mysql \
<span class="hljs-literal">-e</span> MYSQL_ROOT_PASSWORD=root \
<span class="hljs-literal">--name</span> mysql01 mysql:<span class="hljs-number">5.7</span>
</code></div></pre>
<p>可以通过Navicat连接测试<br />
删除容器 数据也在</p>
<h2><a id="5_Redis_130"></a>5 实战:部署Redis集群</h2>
<p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wIDQub8X-1643381954752)(image-20220121230315954.png)]</p>
<h3><a id="51__133"></a>5.1 配置网卡</h3>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta"># </span><span class="language-bash">创建网卡</span>
docker network create redis --subnet 172.38.0.0/16
<span class="hljs-meta"># </span><span class="language-bash">查看网卡</span>
docker network ls
</code></div></pre>
<h3><a id="51_redis_142"></a>5.1 通过脚本创建redis配置文件</h3>
<pre><div class="hljs"><code class="lang-shell">for port in $(seq 1 6); \
do
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.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.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
</code></div></pre>
<h3><a id="53__docker_redis__163"></a>5.3 启动 docker redis 容器</h3>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta"># </span><span class="language-bash">-p: 端口映射 外部端口:内部端口</span>
<span class="hljs-meta"># </span><span class="language-bash">-d: 后台运行</span>
<span class="hljs-meta"># </span><span class="language-bash">--net: 使用redis网络</span>
<span class="hljs-meta"># </span><span class="language-bash">-ip: 绑定ip</span>
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
-v /mydata/redis/node-4/data:/data \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
-v /mydata/redis/node-5/data:/data \
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
</code></div></pre>
<h3><a id="54__201"></a>5.4 进入容器并创建集群</h3>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta"># </span><span class="language-bash">进入容器</span>
docker exec -it redis-1 /bin/sh
<span class="hljs-meta"># </span><span class="language-bash">创建集群</span>
<span class="hljs-meta"># </span><span class="language-bash">集群切片:--cluster-plicas 1</span>
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
</code></div></pre>
<h3><a id="55__211"></a>5.5 连接测试</h3>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta"># </span><span class="language-bash">-c: 集群</span>
redis-cli -c
<span class="hljs-meta"># </span><span class="language-bash">查看集群信息</span>
127.0.0.1:6379> cluster info
<span class="hljs-meta"># </span><span class="language-bash">查看集群节点</span>
cluster nodes
set a b
<span class="hljs-meta">-> </span><span class="language-bash">Redirected to slot [15495] located at 172.38.0.13:6379</span>
OK
<span class="hljs-meta">
# </span><span class="language-bash">模拟redis-3宕机 172.38.0.13</span>
docker stop redis-3
</code></div></pre>
<p>使用dokcer后,所有的技术都会慢慢遍的简单</p>
<h2><a id="7_eskibana_232"></a>7 部署es+kibana</h2>
<blockquote>
<p>elasticsearch</p>
<p>es 暴露端口很多</p>
<p>es 十分耗内存</p>
<p>es的数据一般需要放置到安全目录!挂载</p>
</blockquote>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta"># </span><span class="language-bash">--net somenetwork ? 网络配置</span>
<span class="hljs-meta">
# </span><span class="language-bash">启动</span>
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
<span class="hljs-meta">
# </span><span class="language-bash">会很卡</span>
docker stats # 查看cpu的状态
<span class="hljs-meta">
# </span><span class="language-bash">赶紧关闭,在呢个价内存的限制,修改配置文件 -e 环境配置修改</span>
<span class="hljs-meta"># </span><span class="language-bash">-e ES_JAVA_OPTS=<span class="hljs-string">"-Xms64 -Xmx512m"</span></span>
docker run -d --name elasticsearch01 --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
<span class="hljs-meta">
# </span><span class="language-bash">测试是否成功</span>
curl localhost:9200
</code></div></pre>
留言