docker是一个容器,在这个容器中可以运行镜像,就好像tomcat可以运行war包一样,我们可以把项目打包成一个镜像,丢到docker里面,让它运行,同时一台物理机器可以运行多个docker容器,且他们相互隔离,不会互相影响抢夺cpu和内存。
docker基本命令
docker run ubuntu:15.10 /bin/bash
-i: 交互式操作。
-t: 终端。以命令模式进入容器
-d: 容器在后台运行
-P:将容器内部使用的网络端口随机映射到我们使用的主机上。比如-P 5001:5000
ubuntu: ubuntu 15.10版本镜像。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
docker ps -a
获取所有容器,可以看到容器id
docker start/stop/restart b750bbbcfd88
启动/停止/重启ID为b750bbbcfd88的容器
docker exec 1e560fca3906
退出容器
docker export 1e560fca3906 > ubuntu.tar
docker run -d -P 5001:5000 training/webapp python app.py
-d:让容器在后台运行。
-P:将容器内部使用的网络端口随机映射到我们使用的主机上。通过5001端口来访问容器5000端口
docker commit -m="has update" -a="runoob" e218edb10161 ubuntu:v2
将已有的容器id e218edb10161 创建为一个新的镜像,ubuntu, 它的版本号是v2
DockerFile的作用
由一系列的命令组成,是build或者运行docker时要执行的指令
COPY 复制文件或目录
ENV 设置环境变量
VOLUME 路径,定义匿名数据卷,避免数据因容器重启丢失
dockerfile 例子 :
FROM centos:6.7 //这个镜像基于centos 6.7版本创建
MAINTAINER Fisher "fisher@sudops.com" //坐着
RUN /bin/echo 'root:123456' |chpasswd //修改镜像centos 6.7中root用户的密码,用于新镜像的密码
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D //创建出来的docker镜像被启动后执行cmd后面的命令,
docker build -t runoob/centos:6.8 //创建一个新的 centos 6.8镜像, 它的root用户密码为123456
Docker Compose
Dockerfile 可以让用户管理一个单独的容器,那么如果我要管理多个容器呢?那就要用到docker compose了。
docker compose使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
使用举例:
1.准备一个测试目录,目录下先生成一个app.py文件,这个代码含义是用python的flask框架,为127.0.0.1:5000路径创建了一段逻辑,输出"Hello World! I have been seen {N} times"。
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
然后目录下新建docker-compose.yml,这里是表示以5000端口启动web服务,同时在此容器中启动redis。
# yaml 配置
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
最后新建DockerFile,大家用的时候,记得去掉//和注释。
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py // FLASK_APP变量 用来说明Flask实例对象 app 所在的模块位置
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"] //运行开发服务器
最后在当前目录的终端下输入docker-compose up,就可以编译出一个docker镜像,并运行起来。访问
大家如果有任何问题,欢迎关注"Java自学之路"这个公众号来提问,里面也有自学全套视频(含项目)和Idea激活码等信息。
对于java来说,可以把代码达成war包,然后在docker compose中配置需要tomcat服务,然后在tomcat服务build过程中,把war包复制到tomcat的webapps文件夹,启动docker就可以了。当然,这只是一种方案,大家可以在网上找到更加自动化的方案