入门样例一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;
}
}
复制代码