Docker简介:
-
Docker 相比于 虚拟机具有空间占用小,启动速度快(按秒级), 集成度高,可以有效避免版本不兼容问题。
-
什么是镜像:镜像是一堆只读层的统一,除了最底层没有指向外,每一层都指向它的父层。统一文件系统( Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在。在用户的角度看来,只存在一个文件系统。镜像每一层都是不可写的,都是只读层。
什么是容器:容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。要点:容器 = 镜像 + 读写层,并且容器的定义并没有提及是否要运行容器。
建议实践之后回来理解docker容器与镜像的区别 -
常用操作
docker images :查看所有镜像
docker rmi image-id:删除镜像
docker ps -a:查看所有容器
docker rm container-id:删除容器
docker attach container-id:进入容器 (现在基本使用exec,退出不关闭容器)
docker logs container-id 查看容器内部输出
docker tag imageid:tag name:tag 修改镜像名
docker commit:将容器的可读写层转换为一个只读层,这样就把一个容器转换成了不可变的镜像。 -
alpine
正文:Django项目发布
1.创建文件树
compose
——downline(线下)
—Dockerfile (构建镜像文件)
—pip.conf (加速pip下载速度)
—AIRS (项目文件)
—requirements.txt (安装目录)
—start.sh (启动文件)
——upline(线上)
2.git clone *** 将项目文件存放到AIRS下
3.cp ./AIRS/requireme ./requirements 将要安装的requirements文件保存到与Dockerfile同目录下
4.编写pip.conf文件 vim pip.conf
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
~
5.编写start.sh vim start.sh
python manage.py runserver 0.0.0.0:8000
6.编写Dockerfile文件
#基础镜像 docker pull python:3.6
FROM python:3.6
#定义环境变量
ENV PYTHONUNBUFFERED 1
#将pip.con转移到新镜像的 /root/.pip/pip.conf
COPY pip.conf /root/.pip/pip.conf
#将项目存放到/app文件夹下
COPY AIRS/ /app
#将需要下载的requirements.txt放入工作目录/app下
COPY requirements.txt /app/requirements.txt
#开始下载依赖包
RUN pip install -r /app/requirements.txt
#确定工作目录
WORKDIR /app
#将启动文件放入镜像
copy ./start.sh /app/start.sh
RUN chmod +x /app/start.sh
CMD ["sh", "start.sh"]
7.创建镜像
#docker build -t="用户名/镜像名称:版本(tag) " .(当前目录)
docker build -t="horn/airs:v1.0" .
8.启动容器
#-d 后台运行
#-i 打开STDIN,用于控制台交互
#-t 分配tty设备,该可以支持终端登录,默认为false
#-p 指定容器暴露的端口
#-u 指定容器的用户
#--name 给容器起别名
[root@horn downline]# docker run -d -p 1935:8000 horn/airs:v1.0 python manage.py runserver 0.0.0.0:8000
#显示所有容器
docker ps -a
9.启动成功,但是外部无法访问
法一:通过复制修改容器中的文件,缺点(麻烦)
#将当前目录settings.py 复制到 containerid:/app/推荐系统/settings.py
docker cp ./settings.py 7ed:/app/推荐系统/settings.py
法二:直接进入容器修改配置文件,缺点是需要安装vim,增加容器占用空间
docker run -i –t centos /bin/bash
or
docker exec -it container-id /bin/bash
#获取docker镜像root权限
sudo docker exec -ti -u root container-id /bin/bash
#退出后重启容器: docker restart container
10.Docker仓库
(1)docker login
(2)根据docker账号修改镜像名 ——>用户名/镜像名
docker tag imageid:tag name:tag
(3)将镜像存到docker仓库中
docker push 用户名/镜像名
11.修改镜像
sudo docker commit -m 'modify settings.py' -a "docker horn1998" 9c54 horn1998/airs:v2.0
其中,-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;-a 可以指定更新的用户信息;之后是用来创建镜像的容器的 ID 9c54;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息。
12.docker-compose
1.极速安装
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
2.变量解释
- image: 指定镜像名称或ID,如果镜像本地不存在,则Compose会尝试拉取这个镜像
image: python:3.6-alpine
- build: 基于Dockerfile构造镜像
- args: 定义构建过程中,多位于sh文件中所需要的环境变量,但在构建成功后会取消
e1:build: . #当前目录下寻找Dockerfile,如果同时指定了build, image,则Compose会构建镜像并且把镜像命名为image对应的名字
e2:build:
context:.
args:
build:1
password: secret
- command:时候可以覆盖容器启动后默认执行的命令
command: python manage.py runserver 0.0.0.0:8000
- depends_on:容器启动顺序有要求,控制容器的启动顺序,防止因容器依赖问题而启动失败
depends_on:
-db #其它服务名称
-
CMD: 启动容器后,提供默认命令及参数 (不一定会执行,只是默认) 会docker run 后面参数替换
CMD在容器运行的时候提供一些命令及参数,用法如下:
第一种用法:运行一个可执行的文件并提供参数。
CMD [“sh”, “start.sh ”]
第二种用法:为ENTRYPOINT指定参数。
CMD [“param1”,“param2”]
第三种用法(shell form):是以”/bin/sh -c”的方法执行的命令。
CMD [“/bin/echo”, “this is a echo test ”]
一个dockerfile至多只能有一个cmd,如果有多个,只有最后一个生效。 -
ENTRYPOINT: 启动容器时执行(一定会执行)
- entrypoint与cmd的区别
一般还是会用entrypoint的中括号形式作为docker 容器启动以后的默认执行命令,里面放的是不变的部分,可变部分比如命令参数可以使用cmd的形式提供默认版本,也就是run里面没有任何参数时使用的默认参数。如果我们想用默认参数,就直接run,否则想用其他参数,就run 里面加参数。
原文链接:https://blog.youkuaiyun.com/u010900754/article/detaills/78526443
- external_links:连接不再docker-compose.yml中定义的容器
- links:解决容器之间的连接问题
- ports:映射端口的标签
ports:
- "8000:8000"
- volumes
volume保证Docker的数据持久化, 即使数据不随着container的结束而结束,数据存在于host机器上——要么存在于host的某个指定目录中,要么使用docker自己管理的volume。
volumes:
#此时docker将自动创建一个匿名的volume,并将其挂载到container中的/mysql目录。
- /var/lib/mysql
#如果文件不存在,则docker会自动创建
- /opt/data:/var/lib/mysql
3.样例代码
version: '2'
services:
ssm:
build: .
ports:
- "1935:8000"
image: horn1998/ssm:v2.0
command: sh start.sh
depends_on:
- mysql
volumes:
- /opt/data:/app/data
links:
- mysql
mysql:
image: mysql:latest
ports:
- "3306:3306"
command: service mysql start
4.启动compose:
docker-compose up -d