Docker 基础入门+实例(5)

网络配置

大量的互联网应用服务需要多个容器间进行网络通讯。

docker目前提空了映射容器端口到主机容器互联机制来为容器提供网络服务

端口映射实现访问容器
在启动容器时,若不指定对应的参数,在容器外是不能通过网络访问的。
可以使用-p或-p参数来指定端口映射。

-P

Docker 会随机映射一个30000-49900的端口至容器内部开发的网络端口
docker run -d -P tomcat

Docker 基础入门+实例(5)_第1张图片

可见随机映射出的端口为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)

转载于:https://www.cnblogs.com/oifengo/p/9385957.html

你可能感兴趣的:(Docker 基础入门+实例(5))