网络配置
大量的互联网应用服务需要多个容器间进行网络通讯。
docker目前提空了映射容器端口到主机和容器互联机制来为容器提供网络服务
端口映射实现访问容器
在启动容器时,若不指定对应的参数,在容器外是不能通过网络访问的。
可以使用-p或-p参数来指定端口映射。
-P
Docker 会随机映射一个30000-49900的端口至容器内部开发的网络端口
docker run -d -P tomcat
可见随机映射出的端口为32768,我们即可通过www.locallhost:32768来实现对tomcat的访问
-p
映射所有的端口地址
docker run -d -p 8080:8080 tomcat
映射指定端口地址
docker run -d -p 127.0.0.1:8080:8080 tomcat
映射到指定地址的任意端口
docker run -d -p 127.0.0.1::8080 tomcat
查看端口映射配置
docker port id
也可以查看详情信息
docker inspect id
实现容器互联
容器的连接(linking)系统是除了端口映射外另一种可以与容器中应用进行交互的方式。在源和接收容器间建立一个隧道、接收容器可以查看到源容器指定的信息。
容器互联
–link name:alias
name:连接容器的名字
alias:这个连接的别名
案例
1.先建一个数据库容器db
docker run -d --name db -e MYSQL_ROOT_PASSWORD=123456 mysql
2.创建一个web容器,并把它连接到db容器
docker run -d -P --name web --link db:dblink tomcat
Dokcerfile
Dockerfile是一个文本格式的配置文件,可以快速创建自定义的镜像
基本结构
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时的指令
- #第一行必须是基础镜像信息
- FROM centos:latest
-
- #维护者信息
- MINTAINER ifeng
-
- #镜像操作指令
- RUN yum update -y
- RUN yum install -y nginx
-
- #容器启动时执行命令
- CMD /usr/sbin/ngxin
RUN指令对镜像执行跟随的命令。没运行一条RUN指令。镜像添加新的一层,并提交
CMD指定运行容器的操作指令
指令(RUN FROM MAINTAINER CMD)
指令的一般格式:指令名 指令参数
FROM
FROM jingxiang
在同一个dockerfile中创建多个镜像,可以使用多个FORM指令(每个镜像一个)
MINTAINER
MINTAINER 维护者信息
RUN
RUN 命令
在shell终端中运行的命令,每条RUN命令将在当前镜像基础上执行指定命令。并提交给新的镜像
。当命令过长时可以用\换行
CMD
CMD和INTERPOINT都是运行自行启动的命令
区别在于CMD命令可以被RUN后参数覆盖 而INTERPOINT不可被覆盖
两种方式
- CMD "要执行的命令",“参数1”,“参数2”...
- CMD 要执行的命令 参数1 参数2
指定启动容器时执行的命令,每个dockerfile CMD只能有一条。若多条,则只会执行最后一条。
若用户启动时,制定了运行命令,则会覆盖掉CMD指定的命令
EXPOSE
EXPOSE 端口号 端口号2 ....
告诉暴露的端口号。提供给互联系统使用
ENV
ENV KEY VALUE
提供一个环境变量,用户被后续指令RUN使用,并在容器运行时保持
ADD
ADD SRC dest
复制指定的到容器中的.
可以是Dockerfile所在目录的一个相对路径;也可是URL;也可是tar文件
copy
COPY SRC DEST
复制主机的到容器中的。不存在会自动创建
ENTRYPOINT
- ENTRYPOINT "执行的命令","参数1","参数2"...
- ENTRYPOINT 执行的命令 参数1 参数2
配置容器启动执行的命令,不可被docker run提供的参数覆盖 (与CMD的区别)
只能有一个ENTRYPOINT
VOLUME
VOLUME /path/to/workdir
指定默认的工作目录
Dockerfile实例
首先要把包和Dockerfile放在一起
- [root@localhost docker-file]# ls
-
- Dockerfile nginx-1.9.3.tar.gz pcre-8.37.tar.gz
-
- [root@localhost docker-file]# pwd
-
- /opt/docker-file
创建Dockerfile
- #可以使是id或者镜像的名字
- FROM 3dee
- #MINTAINER zuozhe
- MINTAINER ifeng
- #add 把包添加到容器的指定目录,tar会自动解压
- ADD pcre-8.37.tar.gz /usr/local/src
- ADD nginx-1.9.3.tar.gz /usr/local/src
- #RUN 在容器里运行命令创建用户
- RUN useradd -s /sbin/nologin -M www
- #workdir相当于cd到这个目录
- WORKDIR /usr/local/src/nginx-1.9.3
- RUN 在容器里运行命令进行编译安装
- RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-pcre=/usr/local/src/pcre-8.37 && make && make install
- RUN 在容器里运行命令更改nginx配置文件,前台运行
- RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
- env将nginx启动命令加到环境变量里
- ENV PATH /usr/local/nginx/sbin:$PATH
- #映射80端口
- EXPORE 80
- #执行nginx命令
- CMD "nginx"
执行Dockerfile
docker build -t my-nginx-1:v1 /opt/docker-file/
-t:指定生成镜像的标签信息
-f:指定路径(当前路径可省略)
docker build -t my-nginx-1:v1 .
* .(空格点相对当前目录) *
成功
Successfully built 21273b8e163a
- [root@localhost docker-file]# docker images
-
- REPOSITORY TAG IMAGE ID CREATED SIZE
-
- my-nginx-1 v1 21273b8e163a 14 minutes ago 429.1 MB
Docker-Compose连编应用部署
Docker-Compose是Docker官方编排项目之一,快速在分布式中部署应用。
项目介绍
Compose 项目目是 Docker 官方方的开源项目目,负责实现对 Docker 容器器集群的快速编排。从功
能上看,跟 OpenStack 中的 Heat 十十分类似。
其代码目目前在 https://github.com/docker/compose 上开源。
Compose 定位是 “定义和运行行行多个 Docker 容器器的应用用(Defining and running multi-
container Docker applications)”,其前身是开源项目目 Fig,目目前仍然兼容 Fig 格式的模板文文
件。
通过第一一部分中的介绍,我们知道使用用一一个 Dockerfile 模板文文件,可以让用用户很方方便便的定义一一
个单独的应用用容器器。然而而,在日日常工工作中,经常会碰到需要多个容器器相互配合来完成某项任务
的情况。例例如要实现一一个 Web 项目目,除了了 Web 服务容器器本身,往往还需要再加上后端的数
据库服务容器器,甚至至还包括负载均衡容器器等。
Compose 恰好满足足了了这样的需求。它允许用用户通过一一个单独的 docker-compose.yml 模板文文
件(YAML 格式)来定义一一组相关联的应用用容器器为一一个项目目(project)
- 服务(service):一个应用,一个应用容器,可以包括若干运行相同镜像的容易实例
项目(porject):由一组关联的应用容器完成的一个完整的业务单元,在docker-compose.yml文件中定义
*Compose 项目目由 Python 编写,实现上调用用了了 Docker 服务提供的 API 来对容器器进行行行管理理。因
此,只要所操作的平台支支持 Docker API,就可以在其上利利用用 Compose 来进行行行编排管理理*
Docker-Compose安装
略
- mysqldb:
- image: mysql
- container_name: mysqldb
- ports:
- - "60002:3306"
- environment:
- - MYSQL_ROOT_PASSWORD=123456
- volumes:
- - /yundata/soft_conf/mysql_cnf/mysql/dbdata/:/var/lib/mysql/
- - /yundata/soft_conf/mysql_cnf/mysql/conf/:/etc/mysql/conf.d/
- - /yundata/soft_conf/mysql_cnf/mysql/logs/:/var/log/mysql/
- - /etc/localtime:/etc/localtime
实例
- [root@server ~]# vim docker-compose.yml
- version: "2" # 使用Version 2
- services: # 包含需要操作的容器
- app1: # 容器的名称
- image: centos_nginx # 指定基于哪个镜像
- ports: # 指定映射的端口
- - "8080:80"
- networks: # 指定使用哪个网络模式
- - "net1"
- volumes: # 指定挂载的的目录
- - /data/:/data
- app2:
- image: test_centos
- networks:
- - "net2"
- volumes:
- - /data/:/data1
- entrypoint: tail -f /etc/passwd # 这一句是为了让这个容器不会被关闭
- networks:
- net1:
- driver: bridge
- net2:
- driver: bridge
启动
- [root@server ~]# docker-compose up -d # -d是丢到后台运行
- Creating network "root_net2" with driver "bridge"
- Creating network "root_net1" with driver "bridge"
- Creating root_app2_1 ...
- Creating root_app1_1 ...
- Creating root_app2_1
- Creating root_app1_1 ... done
- [root@server ~]#
停止
- [root@server ~]# docker-compose stop
- Stopping root_app1_1 ... done
- Stopping root_app2_1 ... done
- [root@server ~]#
启动已有的容器
- [root@server ~]# docker-compose start
- Starting app2 ... done
- Starting app1 ... done
- [root@server ~]#
查看容器状态
- [root@server ~]# docker-compose ps
- Name Command State Ports
- ---------------------------------------------------------------
- root_app1_1 /bin/sh -c /usr/local/ngin ... Exit 137
- root_app2_1 tail -f /etc/passwd Exit 137
- [root@server ~]#
删除容器
- [root@server ~]# docker-compose rm -f
- Going to remove root_app1_1, root_app2_1
- Removing root_app1_1 ... done
- Removing root_app2_1 ... done
- [root@server ~]#
停止并删除运行中的容器
- [root@server ~]# docker-compose down
- Stopping root_app1_1 ... done
- Stopping root_app2_1 ... done
- Removing root_app1_1 ... done
- Removing root_app2_1 ... done
- Removing network root_net2
- Removing network root_net1
- [root@server ~]# docker-compose ps
- Name Command State Ports
- ------------------------------
- [root@server ~]#
Dokcer基础入门+实例(1)
Dokcer基础入门+实例(2)
Dokcer基础入门+实例(3)
Dokcer基础入门+实例(4)
Dokcer基础入门+实例(5)