Docker学习6:使用docker构建Jekyll服务和java服务
写在前面
## 文章Dockerfile中涉及apt-get 等操作需更换镜像 在Dockerfile中添加下列
Dockerfile源码,见下面作者github
https://github.com/turnbullpress/dockerbook-code/blob/master/code/6
RUN rm -rf /etc/apt/sources.list
ADD sources.list /etc/apt/
source.list 文件见下面链接 文件位置与Dockerfile文件在同一级目录下
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
1.构建第一个应用
构建2个镜像:
1、一个镜像安装Jekyll以及构建jekyll的软件包
2、通过Apache让Jekyll网站工作起来
工作流程:
1.创建Jekyll镜像和Apache镜像
2.从Jekyll镜像创建容器,通过卷挂载网站源代码
3.从Apache镜像创建容器,运行服务
4.在需要更新时,重复工作
具体步骤可借鉴下面博客
https://www.cnblogs.com/manmanchanglu/p/12000025.html

2.使用docker构建一个java服务
1.一个镜像从URL拉取指定war包文件保存到卷中
2.一个含有Tomcat服务器的镜像运行在这些下载的war文件中
2.1war文件获取程序
构建一个镜像会下载war文件,挂载到卷中
mkdir fetcher
cd fetcher
vim Dockerfile


构建镜像docker build -t jamtur01/fetcher .
2.2.获取war文件
docker run -t -i --name sample jamtur01/fetcher \
https://tomcat.apache.org/tomcat-7.0-doc/appdev/sample/sample.war

查看卷目录


2.3 Tomcat8应用服务器
## 更换镜像RUN rm-rf/etc/apt/sources.listADD sources.list/etc/apt/
vim Dockerfile
FROMubuntu:18.04
LABELmaintainer="james@example.com"
ENVREFRESHED_AT 2016-06-01
RUN apt-get -qq update
RUN apt-get -qq install tomcat8 default-jdk
ENVCATALINA_HOME /usr/share/tomcat8
ENVCATALINA_BASE /var/lib/tomcat8
ENVCATALINA_PID /var/run/tomcat8.pid
ENVCATALINA_SH /usr/share/tomcat8/bin/catalina.sh
ENVCATALINA_TMPDIR /tmp/tomcat8-tomcat8-tmp
RUNmkdir -p $CATALINA_TMPDIR
VOLUME["/var/lib/tomcat8/webapps/"]
EXPOSE8080
ENTRYPOINT["/usr/share/tomcat8/bin/catalina.sh","run"]
docker build -t jamtur01/tomcat8 .
2.4 运行WAR文件
创建tomcat8示例
docker run --name sample_app --volumes-from sample \
-d -P jamtur01/tomcat8
查看容器暴露的端口
docker port sample_app 8080

2.5基于tomcat应用服务器的构建服务
安装ruby
apt-get -qqy install ruby make ruby-dev
安装TProv应用
gem install --no-rdoc --no-ri tprov
tprov // 运行项目


会显示你运行的所有的容器
3.多容器应用栈
一个Node容器,用来服务于Node应用,这个容器会链接到。
一个Redis主容器,用于保存和集群化应用状态,这个容器会链接到。
两个Redis副本容器,用于集群化应用状态。
一个日志容器,用于捕获应用日志。
3.1Node.js镜像

创建dockerfile
wget https://github.com/turnbullpress/dockerbook-code/blob/master/code/6/node/nodejs/nodeapp/package.json
wget https://github.com/turnbullpress/dockerbook-code/blob/master/code/6/node/nodejs/nodeapp/server.js
cd ..
vim Dockerfile
FROM ubuntu:18.04
LABEL maintainer="james@example.com"
ENV REFRESHED_AT 2016-06-01
RUN apt-get -qq update
RUN apt-get -qq install nodejs npm
RUN mkdir -p /var/log/nodeapp
ADD nodeapp /opt/nodeapp/
WORKDIR /opt/nodeapp
RUN npm install
VOLUME ["/var/log/nodeapp"]
EXPOSE 3000
ENTRYPOINT ["nodejs","server.js"]
构建node.js镜像
docker build -t jamtur01/nodejs .
3.2 Redis基础镜像

FROMubuntu:18.04
LABELmaintainer="james@example.com"
ENVREFRESHED_AT 2017-06-01
RUNapt-get -qq update
RUNapt-get install -qq software-properties-common
RUNadd-apt-repository ppa:chris-lea/redis-server
RUNapt-get -qq update
RUNapt-get -qq install redis-server redis-tools
VOLUME["/var/lib/redis","/var/log/redis"]
EXPOSE6379
CMD[]
构建redis基础镜像 docker build -t jamtur01/redis .
3.3 Redis主镜像

FROMjamtur01/redis
LABELmaintainer="james@example.com"
ENVREFRESHED_AT 2016-06-01
ENTRYPOINT["redis-server","--protected-mode no","--logfile /var/log/redis/redis-server.log"]
构建Redis主镜像 docker build -t jamtur01/redis_primary .
3.4 Redis 副本镜像

FROMjamtur01/redis
LABELmaintainer="james@example.com"
ENVREFRESHED_AT 2016-06-01
ENTRYPOINT["redis-server","--protected-mode no","--logfile /var/log/redis/redis-replica.log","--slaveof redis_primary 6379"]
docker build -t jamtur01/redis_replica .
3.5 创建Redis后端集群
创建express网络
docker network create express
运行redis 主容器
docker run -d -h redis_primary \
--net express --name redis_primary jamtur01/redis_primary
-h 用来设置容器的主机名,可以确保redis_primary 作为主机名,并被本地DNS服务正确解析
redis容器日志
docker logs redis_primary
看不到日志。 redis服务会将日志保存成文件,使用docker看不到日志,可以使用之前看到的 /var/log/redis 卷。
读取redis主日志
docker run -ti --rm --volume-from redis_primary \
ubuntu cat /var/log/redis/redis-server.log

运行第一个redis容器副本
docker run -d -h redis_replica1 \
--name redis_replica1 \
--net express \
jamtur01/redis_replica
读取redis副本容器日志
docker run -ti --volumes-from redis_replica1 \
ubuntu cat /var/log/redis/redis-replica.log

运行第二个redis容器副本
docker run -d -h redis_replica2 \
--name redis_replica2 \
--net express \
jamtur01/redis_replica
读取redis副本容器日志
docker run -ti --volumes-from redis_replica2 \
ubuntu cat /var/log/redis/redis-replica.log

3.6创建Node容器
运行Node.js容器
docker run -d \
--name nodeapp -p 3000:3000 \
--net express \
jamtur01/nodejs
查看nodeapp容器日志
docker logs nodeapp



3.7 捕获应用日志
创建Dockerfile

FROMubuntu:18.04
LABELmaintainer="james@example.com"
ENVREFRESHED_AT 2016-06-01
RUNapt-get -qq update
RUNapt-get -qq install wget gnupg2 openjdk-8-jdk
RUNwget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add -
RUNecho"deb https://artifacts.elastic.co/packages/5.x/apt stable main"| tee -a /etc/apt/sources.list.d/elastic-5.x.list
RUNapt-get -qq update
RUNapt-get -qq install logstash
WORKDIR/usr/share/logstash
ADDlogstash.conf /usr/share/logstash/
ENTRYPOINT["bin/logstash"]
CMD["-f","logstash.conf","--config.reload.automatic"]
4. 不使用SSH管理Docker容器
使用docker kill发送信号
docker kill -s <signal> <container>
安装nsenter
工具nsenter可以进入docker用来构成容器的内核命名空间,进入一个已经存在的容器shell,即使容器没有运行ssh或任何的守护进程。
docker run -v /usr/local/bin:/target jpetazzo/nsenter
获取容器进程ID
sudo docker inspect --format '{{.State.Pid}}' nodeapp

使用nsenter进入容器
nsenter --target $PID --mount --uts --ipc --net --pid
Docker学习6:使用docker构建Jekyll服务和java服务的更多相关文章
- docker学习之使用 DockerFile 构建镜像并搭建 swarm+compose 集群
题目要求 (1)将springboot应用程序打成jar包:Hot.jar (2)利用dockerfile将Hot.jar构建成镜像 (3)构建 Swarm 集群 (4)在 Swarm 集群中使用 c ...
- docker学习笔记:简单构建Dockerfile【Docker for Windows】
参考与入门推荐:https://www.cnblogs.com/ECJTUACM-873284962/p/9789130.html#autoid-0-0-9 最近学习docker,写一个简单构建Doc ...
- Docker学习笔记_10 docker应用 - 部署TOMCAT服务
选择基镜像 基镜像使用dokcer hub官方提供的tomcat8 alpine当前最新版本,https://hub.docker.com/_/tomcat/ docker pull tomcat:8 ...
- 【Docker学习之七】Docker图形化管理和监控
环境 docker-ce-19.03.1-3.el7.x86_64 centos 7 一.Docker管理工具 (官方三剑客)1.Docker Machine(学习的Openstack Heat)Cr ...
- DOCKER 学习笔记7 Docker Machine 建立虚拟机实战,以及错误总结
前言 通过以上6小节的学习,已经可以使用DOCKER 熟练的部署应用程序了.大家都可以发现使用 DOCKER 带来的方便之处,因为现在的话,只是在一台服务器上部署,这样部署,我们只需要一条命令,需要的 ...
- Docker学习第一天(Docker入门&&Docker镜像管理)
简介 今天小区的超市买零食老板给我说再过几天可能就卖完了我有点诧异,老板又说厂家不生产了emmm 今天总算开始docker了! 1.Docker? 1.什么是Docker Docker 是一个开源的应 ...
- Docker学习笔记之docker volume 容器卷的那些事(一)
预览目录 volume 方式 相关用例 使用方式 使用 volume driver bind mount 方式 相关用例 使用方式 配置selinux标签 配置macOS的安装一致性 tmpfs 方式 ...
- Docker学习笔记之Docker的Build 原理
0x00 概述 使用 Docker 时,最常用的命令无非是 docker container 和 docker image 相关的子命令,当然最初没有管理类命令(或者说分组)的时候,最常使用的命令也无 ...
- Docker学习笔记之Docker的数据管理和存储
0x00 概述 数据是应用程序重要的产出,所以很好的管理和存储数据,是对应用程序劳动结果的尊重.特别是在大数据时代,所有的数据都是重要的资产,保护好数据是每个开发者必须掌握的技能.我们知道,在 Doc ...
随机推荐
- Python-selenium:鼠标键盘事件
鼠标事件 # 每个模拟事件后需加.perform() 才会执行 # context_click() 右击 # double_click() 双击 # drag_and_drop(source, tar ...
- 【Flutter 混合开发】与原生通信-MethodChannel
Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-iOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...
- Linux命令之命令别名
对于经常执行的较长的命令,可以将其定义成较短的别名,以方便执行 显示当前shell进程所有可用的命令别名 [04:33:43 root@C8[ ~]#alias alias cp='cp -i' al ...
- 如何配置网络,使内网和WiFi同时使用
实习已经一个多月了,来分享一个网络小知识, 进入正题了,初次进公司都会遇到一个问题,就是公司内网和WiFi不能同时使用,其实打开powershell配置一下路由即可 1. 打开powershell( ...
- python 数据分析之pandas
pandas 是数据分析时必须用到的一个库,功能非常强大 其有两种数据结构:一维Series 二维表DataFrame(一般读取后的数据都是df) 导入:import pandas as pd 数 ...
- Java学习的第四十四天
1.例5.4将二维数组的行列互换 public class cjava { public static void main(String []args) { int [][]a=new int [][ ...
- model基础操作(上)
1.创建表 https://www.cnblogs.com/xiaonq/p/7978409.html 1.1 Meta源信息 from django.db import models c ...
- .NET Core如何进行请求转发?
前言 冒个泡,近日,有关注我公众号的小伙伴私信我,遇到一个问题搞了很久没解决,此问题具有参考意义,这里跟大家分享下,希望对后续可能有需要的你能有所参考和帮助. 请求转发问题 内网环境跟外网隔离,现在外 ...
- [LuoguP2147] [SDOI2008]洞穴勘测 (LCT维护连通性)
题面 传送门:https://www.luogu.org/problemnew/show/P2147 Solution 这题...... 我们可以发现题目要求我们维护一个动态森林,而且只查询连通性.. ...
- AtCoder Beginner Contest 181 题解
总结 第一次 \(AK\ ABC\) 的比赛,发一个截图纪念一下 A - Heavy Rotation 题目大意 一个人一开始穿白衣服,一天后换成黑衣服,再过一天又换成白衣服,问第 \(n(n \le ...