166.8. Docker Example

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

166.8.1. Example Java - Spring boot with Docker

166.8.1.1. 获取 CentOS 7 镜像

docker pull centos:7

		
# docker pull centos:7
7: Pulling from library/centos
343b09361036: Pull complete 
Digest: sha256:bba1de7c9d900a898e3cadbae040dfe8a633c06bc104a0df76ae24483e03c077
Status: Downloaded newer image for centos:7
		
		

基于 CentOS 7 运行一个容器

docker run -it --name mycentos docker.io/centos:7 /bin/bash

		
# docker run -it --name mycentos docker.io/centos:7 /bin/bash
		
		

运行后直接进入了容器的shell控制台默认是bash

166.8.1.2. 安装 openjdk

		
# yum install -y java-1.8.0-openjdk

# cat >> /etc/profile.d/java.sh <<'EOF'
export JAVA_HOME=/usr/java/default
export JAVA_OPTS="-server -Xms2048m -Xmx4096m -Djava.io.tmpdir=/tmp -Djava.security.egd=file:/dev/./urandom -Dfile.encoding=UTF8 -Duser.timezone=GMT+08"
export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib:.
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:
EOF

# source /etc/profile.d/java.sh
		
		

检查Java是否安装成功

		
# whereis java
java: /usr/bin/java /usr/lib/java /etc/java /usr/share/java /usr/share/man/man1/java.1.gz

# java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)
		
		

创建应用程序目录

# mkdir -p /www/netkiller.cn/www.netkiller.cn/		
		

推出当前容器

# exit
		

166.8.1.3. Spring boot 包

复制 jar 文件到Docker容器

		
docker cp /www/netkiller.cn/www.netkiller.cn/www.netkiller.cn-0.0.1.war mycentos:/usr/local/libexec
		
		

166.8.1.4. 启动 Spring boot 项目

启动容器

		
# docker start mycentos
mycentos		
		
		

进入容器

		
# docker exec -it mycentos /bin/bash
		
		

如果仅仅是测试可以手动启动 Srping boot 项目

		
# cat >> /root/run.sh <<EOF
java -server -Xms2048m -Xmx8192m -jar /usr/local/libexec/www.netkiller.cn-0.0.1.war
EOF

chmod u+x /root/run.sh
		
		

生产环境请使用启动脚本

				
# curl -s https://raw.githubusercontent.com/oscm/build/master/Application/Spring/service/springbootd -o /etc/init.d/springbootd
# chmod +x /etc/init.d/springbootd
		
		

编辑启动脚本 /etc/init.d/springbootd 修改下面配置项

		
##############################################
BASEDIR="/www/netkiller.cn/api.netkiller.cn"
JAVA_HOME=/srv/java
JAVA_OPTS="-server -Xms2048m -Xmx8192m -Djava.security.egd=file:/dev/./urandom"
PACKAGE="api.netkiller.cn-0.0.2-release.jar"
CONFIG="--spring.config.location=$BASEDIR/application.properties"
USER=www
##############################################
NAME=springbootd
PROG="$JAVA_HOME/bin/java $JAVA_OPTS -jar $BASEDIR/$PACKAGE $CONFIG"
LOGFILE=/var/tmp/$NAME.log
PIDFILE=/var/tmp/$NAME.pid
ACCESS_LOG=/var/tmp/$NAME.access.log
##############################################
		
		

你也可以使用 systemd 启动脚本,详见《Netkiller Java 手札》

166.8.1.5. 基于 CentOS 7 制作 spring 镜像

docker commit mycentos springboot:1

		
# docker commit mycentos springboot:1
sha256:757d92d642d1b5a7b244f6ddf89f24a8d463d154438651c83ba51a644b401782		
		
		

启动 spring boot 容器

		
# docker run -d --name springboot -p 80:8080 springboot:1 /root/run.sh
		
		

		
-d: 以守护进程方式启动 
--name:指定容器的名称 
-p:映射容器8080端口到宿主机的80端口 
springboot:1 :上一步制作好的springboot镜像,版本号为1	
		
		

启动容器

		
# docker start springboot		
		
		

停止容器

		
# docker stop springboot		
		
		

166.8.2. Redis

166.8.2.1. 获取 Redis 镜像

docker pull redis

		
# docker pull redis  
Using default tag: latest
latest: Pulling from library/redis
10a267c67f42: Pull complete 
5b690bc4eaa6: Pull complete 
4cdd94354d2a: Pull complete 
71c1f30d820f: Pull complete 
c54584150374: Pull complete 
d1f9221193a6: Pull complete 
d45bc46b48e4: Pull complete 
Digest: sha256:548a75066f3f280eb017a6ccda34c561ccf4f25459ef8e36d6ea582b6af1decf
Status: Downloaded newer image for redis:latest
		
		

166.8.2.2. 启动一个 Redis 实例

# docker run --name my-redis -d redis
10207174e18f61290f9c869e6437fa787e459e07b076b82cedf800a8c37c515d		
		

查看启动情况

		
# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
10207174e18f        redis               "docker-entrypoint..."   8 minutes ago       Up 8 minutes        6379/tcp            my-redis
		
		

166.8.2.3. 进入 Redis

		
# docker run -it --link my-redis:redis --rm redis redis-cli -h redis -p 6379
redis:6379> set name neo
OK
redis:6379> get name
"neo"
redis:6379> exit
				
		

166.8.2.4. 启动一个 Redis 实例并映射 6379 端口

		
# docker rm my-redis
my-redis

# docker stop my-redis
my-redis

# docker run --name my-redis -d -p 6379:6379 redis
10207174e18f61290f9c869e6437fa787e459e07b076b82cedf800a8c37c515d

# docker ps -a                                    
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
1c4540d8617f        redis               "docker-entrypoint..."   2 seconds ago       Up 1 second         0.0.0.0:6379->6379/tcp   my-redis
		
		

检查端口

		
# ss -lnt | grep 6379
LISTEN     0      128         :::6379                    :::*  
		
		

166.8.2.5. 维护容器

使用下面命令进入容器维护 Redis

		
# docker exec -it my-redis /bin/bash
root@1c4540d8617f:/data#

root@1c4540d8617f:/data# redis-server -v
Redis server v=3.2.9 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=a30533b464d1689b
		
		

166.8.3. Nginx

本例子使用 alpine 版本

166.8.3.1. nginx:latest

过程 166.1. 

  1. [root@iZj6ciilv2rcpgauqg2uuwZ]~# docker pull nginx
    Using default tag: latest
    latest: Pulling from library/nginx
    Digest: sha256:41ad9967ea448d7c2b203c699b429abe1ed5af331cd92533900c6d77490e0268
    Status: Image is up to date for nginx:latest
    				
  2. 启动容器

    docker run --name my-nginx-container -p 80:80 -d nginx
    				

    上面不能满足生产环境的需求,通常不会将数据放在容器中,我的做法如下。

    docker rm my-nginx-container -f
    docker run --name my-nginx-container \
    	-v /srv/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
    	-v /srv/nginx/conf.d:/etc/nginx/conf.d:ro \
    	-v /var/log/nginx:/var/log/nginx:rw \
    	-v /www:/www:ro \
    	-p 80:80 -d nginx
    docker ps
    				

166.8.3.2. 安装 Docker Nginx alpine

过程 166.2. Docker nginx

  1. 获取镜像

    # docker pull nginx:alpine
    				
  2. 运行容器

    				
    docker run --name my-nginx-container -v /srv/nginx:/etc/nginx:ro -v /www:/www:ro -p 80:80 -d nginx:alpine
    				
    				
  3. docker exec -it my-nginx-container /bin/bash
    				




原文出处:Netkiller 系列 手札
本文作者:陈景峯
转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
运维 Java Android开发
认识Docker
认识Docker
|
3月前
|
Linux 虚拟化 开发者
Docker(1)
Docker定义 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
|
8月前
|
Java Linux 虚拟化
docker
docker
1262 0
|
7月前
|
存储 关系型数据库 Linux
|
10月前
|
存储 安全 测试技术
Docker初步了解
Docker初步了解
53 0
|
11月前
|
消息中间件 JavaScript 小程序
Docker 认错了!
Docker 认错了!
|
Linux Docker Python
JupyterNotebook-Docker版
制作jupyter notebook的docker镜像,兼容numpy, pandas, matplotlib, pyspark, opencv-python, requests, flask等组件。
356 0
|
测试技术 Linux 持续交付
为什么会是Docker?
最近Docker容器化部署特别火热,那为什么说Docker是下一代的容器工具?回答这个问题之前,我们就服务器的历史演变来简单说明一下。
为什么会是Docker?
|
运维 Ubuntu Linux
docker简单理解
docker简单理解
82 0