Docker 数据卷和容器编排,记录下来!💻🦄html
数据卷能够绕过拷贝系统,在多个容器之间、容器和宿主机之间共享目录或文件,数据卷绕过了拷贝系统,能够达到本地磁盘I/O性能。mysql
$ docker run -itd --name nginx -v /usr/share/nginx/html/ -p 80:80 e445ab08b2be
复制代码
此时,咱们建立了一个数据卷而且挂载到容器的/usr/share/nginx/html/目录下。nginx
使用 docker inspect
命令找到数据卷映射目录:git
Docker默认将宿主机的/var/lib/docker/volumes/1baaa58867f6e5b6bed703b0eae6ae859d39fa293ad5d85f58bf73d6101914c6/_data目录做为source目录,接下来,进入到该目录中:github
注意:因为Mac中的Docker有点特殊,上文提到的/var/lib/xxxx目录,若是是在Linux环境下,则直接进入便可, 若是是在mac中,须要首先执行以下命令,在新进入的命令行中进入到/var/lib/xxx目录下: screen ~/Library/Containers/com.docker.docker/Data/vms/0/ttyweb
接下来修改数据卷中的index.html文件内容,以下:sql
$ echo "hello volumes">index.html
复制代码
修改完成后,再回到浏览器中,输入127.0.0.1,查看nginx中index.html页面中的数据,发现已经发生改变。docker
注意:Linux环境下输入
curl 127.0.0.1
数据库
上文中对于数据卷的用法还不是最佳方案,通常来讲,咱们可能须要明确指定将宿主机中的一个目录挂载到容器中,这种指定方式以下:ubuntu
$ docker run -itd --name nginx2 -v /root/www/:/usr/share/nginx/html/ -p 8889:80 98ebf73aba75
复制代码
这样即是将宿主机中的 /root/www/
目录挂载到容器的 /usr/share/nginx/html/
目录下,接下来只须要在 /root/www/
目录下添加、修改html文件,都能在nginx访问中立马看到效果。这种用法对于开发测试很是方便,不用从新部署,重启容器等。
注意:宿主机目录是一个绝对路径。
VOLUME /usr/share/nginx/html/
复制代码
这样就配置了一个匿名数据卷,运行过程当中,将数据写入到/usr/share/nginx/html/目录中,就能够实现容器存储层的无状态变化。
$ docker volume ls
复制代码
$ docker volume inspect
复制代码
$ docker volume rm
复制代码
注意:在使用中的数据卷,须要先将相关的容器中止并移除,才能删除。
数据卷容器是一个专门用来管理数据卷的容器,该容器主要是供其余容器的引用和使用。
$ docker run -itd -v /usr/share/nginx/html/ --name mydata ubuntu
复制代码
$ docker run -itd --volumes-from mydata 80:80 --name nginx1 nginx
$ docker run -itd --volumes-from mydata 81:80 --name nginx2 nginx
复制代码
此时,nginx1和nginx2都挂载了同一个数据卷到/usr/share/nginx/html/目录下,三个容器中,任意一个修改了该目录下的文件,其余两个都能看到变化。
通常来讲,容器启动后,咱们都是经过端口映射来使用容器提供的服务,端口映射只是使用容器服务的一种方式,除了这种方式外,还可使用容器链接的方式来使用容器服务。
例如,有两个容器,一个容器运行一个SpringBoot项目,另外一个容器运行着mysql数据库,能够经过容器链接使 SpringBoot直接访问到Mysql数据库,而没必要经过端口映射来访问mysql服务。
为了案例简单,我这里举另一个例子:
有两个容器,一个nginx容器,另外一个ubuntu,我启动nginx容器,可是并不分配端口映射,而后再启动 ubuntu,经过容器链接,在ubuntu中访问nginx。
具体操做步骤以下:
$ docker run -d --name nginx1 nginx
复制代码
容器启动成功后,在宿主机中是没法访问的。
接下来,启动一个ubuntu,而且和nginx创建链接,以下:
$ docker run -dit --name ubuntu --link nginx1:mylink ubuntu bash
复制代码
这里使用--link创建链接,nginx1是要创建链接的容器,后面的mylink则是链接的别名。
运行成功后,进入到ubuntu容器命令行:
$ docker exec -it ubuntu bash
复制代码
在ubuntu控制台直接输入env,查看环境变量信息:
注意:默认状况下,ubuntu容器中没有安装curl命令,须要手动安装下,安装命令以下:
apt-get update
和apt-get install curl
。
使用docker-compose能够实现容器编排。
Compose是一个用于定义和运行多容器Docker应用程序的工具。
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
复制代码
sudo chmod +x /usr/local/bin/docker-compose
复制代码
$ docker-compose --version
复制代码
FROM tomcat
ADD https://github.com/JpressProjects/jpress/raw/alpha/wars/jpress-web-newest.war /usr/local/tomcat/webapps/
RUN cd /usr/local/tomcat/webapps/ \
&& mv jpress-web-newest.war jpress.war
复制代码
解释:
- 容器基于Tomcat建立。
- 下载jpress项目的war包到tomcat的webapps目录下。
- 给jpress项目重命名。
version: '3.1'
services:
web:
build: .
container_name: jpress
ports:
- '8080:8080'
volumes:
- /usr/local/tomcat/
depends_on:
- db
db:
image: mysql
container_name: mysql
command: --default-authentication-plugin=mysql_native_password
restart: always
ports:
- '3306:3306'
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: jpress
复制代码
- 首先声明了web容器,而后声明db容器。
- build .表示web容器项目构建上下文为.,即,将在当前目录下查找Dockerfile构建web容器。
- container_name表示容器的名字。
- ports是指容器的端口映射。
- volumes表示配置容器的数据卷。
- depends_on表示该容器依赖于db容器,在启动时,db容器将先启动,web容器后启动,这只是启动时机 的前后问题,并非说web容器会等db容器彻底启动了才会启动。
- 对于db容器,则使用image来构建,没有使用Dockerfile。
- restart描述了容器的重启策略。
- environment则是启动容器时的环境变量,这里配置了数据库root用户的密码以及在启动时建立一个名为 jpress的库,environment的配置可使用字典和数组两种形式。
注意:docker-compose.yml文件里面不能有多余的空格!不然会运行不成功。
运行:
$ docker-compose up -d
复制代码
浏览器输入http://localhost:8080/jpress,就能够看到jpress的配置页面。
# 中止容器运行
$ docker-compose stop
# 启动容器
$ docker-compose start
# 重启容器
$ docker-compose restart
复制代码
注意:需在docker-compose.yml和Dockerfile所在目录下执行以上命令。
没有什么是永恒的!🌴
欢迎关注我的微信公众号:桃李报春 我的博客:leeyunt.top