Docker和Docker-compose基础用法和总结12-15

入门样例一docker:

apt-get install -y(没有 -y的命令也可以执行,系统会提示你是否安装,输入y,回车,就会安装了)
                镜像名:标签  当前目录,包括dockerfile
docker build -t imagename:tag .
                              指定dockerfile文件路径
docker build -t imagename:tag -f  /path/to/a/Dockerfile .

.是指“镜像构建上下文”
作用:,当构建的时候,由用户指定构建镜像的上下文路径,而 docker build 会将这个路径下所有的文件都打包上传给 Docker 引擎,引擎内将这些内容展开后,就能获取到所有指定上下文中的文件了。

.dockerignore 文件是起什么作用的呢,不管是在 docker build 过程中,还是 docker run 的过程中,有没有这个文件好像并没有什么很大的影响,存在感不强的一个文件

当我们在 docker build 的过程中,首先会将指定的上下文目录打包传递给 docker引擎,而这个上下文目录中可能并不是所有的文件我们都会在 Dockerfile 中使用到,那么这个时候就可以在 .dockerignore 文件中指定在传递给 docker引擎 时需要忽略掉的文件或文件夹。

    .dockerignore 应用
        如:文件内容
            requirements.txt
        build打包给docker引擎时就不包含requirements.txt文件,build就会出错
LABEL命令
****你可以给镜像添加标签来帮助组织镜像、记录许可信息、辅助自动化构建,或者因为其他的原因
    每个标签一行,由LABEL开头加上一个或多个标签对。下面的示例展示了各种不同的可能格式。
    注释内容是解释。
RUN命令
****apt-get update放在一条单独的RUN声明中会导致缓存问题以及后续的apt-get install失败
    Docker 发现修改后的RUN apt-get update指令和之前的完全一样。所以,
    apt-get update不会执行,而是使用之前的缓存镜像。因为apt-get update没有运行,
    后面的apt-get install可能安装的是过时的curl和nginx版本
CMD命令
****可以包含参数CMD ["executable", "param1", "param2"…]
EXPOSE命令
****EXPOSE指令用于指定容器将要监听连接的端口
ENV命令-------------------------------------运用??????????见顶部TODO项
****ENV指令也可用于为你想要容器化的服务提供必要的环境变量,用$PG_VERSION访问

    假如你安装了JAVA程序,需要设置JAVA_HOME,那么可以在Dockerfile中这样写:
    ENV JAVA_HOME /path/to/java/dirent
ARG命令
****用于dockerfile中定义变量,使用时用${REDIS_SET_PASSWORD}获取
ADD 和 COPY
****用于复制,一般优先使用COPY,COPY只支持简单将本地文件拷贝到容器中
****ADD可以用于 ADD有一些并不明显的功能(比如本地 tar 提取和远程 URL 支持)
VOLUME命令
****作用数据持久化,挂载本地目录到container,修改时同步
通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的
1.
    在dockerfile中用VOLUME 路径(例: /data1), 会挂载容器内路径,主机则会随机生成(例:)
    docker inspect container id查看,统一镜像不同容器不同
        "Mounts": [
            {
                "Type": "volume",
                "Name": "71965d34838e220069b69a5f2df325b9cbcb94deb3a2bc16d784a45f8b1ad010",
                "Source": "/var/lib/docker/volumes/71965d34838e220069b69a5f2df325b9cbcb94deb3a2bc16d784a45f8b1ad010/_data",
                "Destination": "/data1",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ]
    Destination 容器路劲, Source主机路径
2.在run 的时候指定
        主机文件地址       容器文件目录地址
    -v /home/xqh/myimage:/data

    -v /data同上面1效果相同,会在本机上随机绑定一个目录(这种方式对应的主机目录是自动创建的,其目的不是让在主机上修改,而是让多个容器共享----如何共享---看第三条)
3.
    容器共享卷(挂载点)
    docker run --name test1 -it myimage /bin/bash
    下面我们创建另一个容器可以和test1共享 /data1 和 /data2卷 ,这是在 docker run中使用 --volumes-from标记,如:

    可以是来源不同镜像,如:
    docker run --name test2 -it --volumes-from test1  ubuntu  /bin/bash
    也可以是同一镜像,如:
    docker run --name test3 -it --volumes-from test1  myimage  /bin/bash
    上面的三个容器 test1 , test2 , test3 均有 /data1 和 /data2 两个目录,且目录中内容是共享的,任何一个容器修改了内容,别的容器都能获取到

WORKDIR命令
****设置工作目录

进入一个正在运行的容器       容器id
    sudo docker exec -it 775c7c9ee1e1 /bin/bash


入门样例一docker-compose:
安装:
    curl:
        sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
        sudo chmod +x /usr/local/bin/docker-compose 添加执行权限
        docker-compose --version 测试

    卸载:
        sudo rm /usr/local/bin/docker-compose

    PIP 安装
        sudo pip install -U docker-compose
    卸载:
        sudo pip uninstall docker-compose

version 不同版本支持配置不一样---具体???
    

docker-compose up 启动镜像
docker-compose up -d 后台运行方式启动
docker-compose stop 停止服务
docker-compose down 在你的项目路径下使用,停止镜像,移除容器,也可以在原始的终端上使用 CTRL+C 停止当前启动着的应用。
docker-compose down --volumes 传递 —volumes 还可以删除 Redis 容器中所使用的数据卷
docker-compose ps 查看镜像启动列表信息,来查看当前运行的应用
docker-compose run web env  指定服务上运行一个命令
docker-compose build web 服务被创建后会标记为project_service(比如composetest_db),如果改变了一个服务的Dockerfile或者构建目录的内容,可以使用docker-compose build来重建它, build后需要重新up才会生效

删除的时候也需要指定docker-compose -f test.yml -p test_name down(因为配置文件名称不是docker-compose.yml,所以在执行一系列命令时需要加上-f test.yaml等配置)
docker-compose -f test.yml(可以使用绝对路径)默认如果没有指定具体的compose配置文件,那么就docker-compose.yml
docker-compose -p test_name 如果不指定项目名称,默认就是文件夹的name

docker-compose config 打印处配置文件的内容和service名称以及volumes信息
docker logs 容器id/服务名... 打印容器中的日志
docker-compose port redis 6379 查看端口映射信息
docker-compose scale web=2 worker=3 扩展容器,为service设置多个容器, ----注意:而且在创建多个容器时需要考虑端口及ip的监听状况(占用的情况),如何处理???????????
删除启动失败的服务docker-compose rm redis,只会删除State = Exit 128,即启动失败的
或者docker rm composetest_redis_2

docker-compose scale web=1 redis=2 在服务启动后(必须先启动),扩容,少则加,多则删
复制代码

dockerfile例子

# Use an official Python runtime as a parent image
FROM python:2.7-slim
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
COPY . /app
# ADD redis-2.8.17.tar.gz /app
# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# 通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的
VOLUME /data1:/data
# Make port 80 available to the world outside this container
# EXPOSE 80
ARG REDIS_SET_PASSWORD=developer2
# Define environment variable
ENV NAME World ${REDIS_SET_PASSWORD}
LABEL com.example.version="0.0.1-beta"
# Run app.py when the container launches
CMD ["python", "app.py"]
复制代码

docker-compose例子:

version: '2.0'
services:
  web:
    #指定build上下文
    build:
      context: .
      #指定dockerfile运行参数
      args:
        gitcommithash: cdc3b19
    #指定容器名
    container_name: 11-28-web
    #配置主机名称
    hostname: web_hostname
    #expose expose: 5000     提供container之间的端口访问,这里只是声明,无实际效果,只是指示开发用
    #指定端口映射
    ports:
     - "5000:5000"
    #配置文件挂载
    volumes:
     - .:/code
     - data:/code/data
    #添加host配置信息
    extra_hosts:
     - "somehost:162.242.195.82"
     - "otherhost:50.31.209.229"
    #从其他服务挂载相同文件或文件目录(本地开发适用,例: 修改了backend)--只是加了一个其他服务的挂载
    volumes_from:
      - redis
    #设置成总是启动,指定容器退出后的重启策略为始终重启
    restart: always
    #设置依赖,即先启动的服务,但是并不是完全启动好
    depends_on:
      - redis
    #depends_on:(2.1版本添加的属性)
    #  redis:
    #     condition: service_healthy/condition: service_started 设置依赖条件
    #定义环境变量文件/或文件list
    #env_file:
    #配置环境变量
    environment:
      - TEST_ENV1=eddy1
      - TEST_ENV2=eddy2
    #继承公共配置,如需修改,可在此重新定义,定义后会完全覆盖
    extends:
      file: "docker-compose-common.yml"
      service: "common"
  redis:
    #指定b运行镜像
    image: "redis:alpine"
    container_name: 11-28-redis
    hostname: redis_hostname
#声明上述data挂载已经在之前建好了目录,用docker volume create --name=data新建,docker volume inspect data查看地址
volumes:
  data:
    external: true
    #name: my-app-data 可以用name去指定其他名字的挂载目录

复制代码

问题:

1.network配置, 可用于固定ip地址?
2.scale起多个对外指定接口的服务的时候,如何区别ip地址  --待定
3.容器间用服务名访问,那群脉是怎么指定的?--nginx指定fastcgi_pass omnisocials-backend:9000;
4,docker起的容器在容器间怎么访问? link extarl-link 主机端口映射
5.--link 容器名:别名,调用用别名访问(问题:这样会在容器的hosts中加上ip: 别名 信息,可以ping通和正常访问
        但是前端调用的时候还是访问的主机的hosts,里面的hosts配置不起作用????????????),因为是把代码都加载到了浏览器,再发的
        如果是后端应该没有问题,配置nginx做转发
复制代码

对比:

docker单独run,容器间访问,正确的
    frontend:--使用link会在host和env中添加host(ip: host)和env配置
        docker run -d --name eddy-vwork-frontend-continer -p 80:80 -v /home/user/Desktop/ssh-now/vwork/vwork-frontend/dist:/usr/share/nginx/html --link vwork-customer-eddy-continer:ajax.eddy.com  vwork_vwork-frontend
    backend:
        docker run -d --name vwork-customer-eddy-continer -v /home/user/Desktop/ssh-now/vwork/vwork-backend/vwork-customer/target:/vwork vwork_vwork-backtend
    测试
        curl http://ajax.eddy.com:8000/customer/stores?pageSize=5&pageNum=1&sortKey=store_code&sortValue=DESC
        curl http://172.17.0.2:8000/customer/stores?pageSize=5&pageNum=1&sortKey=store_code&sortValue=DESC
    对比
        docker-compose不需要link就可以通过服务名访问,ping之后可以正确访问ip
        link后可以添加别名访问
复制代码

nignx 配置:

server {
    listen 80;
    server_name  vwork.com;
    root  /usr/share/nginx/html;
    index index.html index.htm index.php;

    access_log /var/log/nginx/vwork.com-access.log;
    error_log  /var/log/nginx/vwork.com-error.log;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location ~ /\.(ht|svn|git) {
            deny all;
    }
}

server {
    listen 80;
    server_name  ajax.vwork.com;

    access_log /var/log/nginx/ajax.vwork.com-access.log;
    error_log  /var/log/nginx/ajax.vwork.com-error.log;

    location / {
        # 后端服务地址
        proxy_pass http://vwork-backtend:8000/;
    }

    location ~ /\.(ht|svn|git) {
            deny all;
    }
}

复制代码

转载于:https://juejin.im/post/5c14effef265da61141c7ea2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值