docker从0到0.5
docker从0到0.5
什么是docker
下面三样组成了docker的体系:
- Dockerfile(配置文件):声明构建镜像时需要安装的依赖和要copy到镜像中的源码文件;类比Makefile
- image(镜像):保存环境状态;正如anaconda的虚拟环境,不同的是anaconda中的环境是动态的,可以随时进行修改,而镜像是静态的,像个照片,只按Dockerfile的要求构建了需要的依赖
- container(容器):运行image的内容,不同的container类比不同的进程,a不会干扰b的执行
它们之间的执行流程:
docker和虚拟机有什么不同
docker | 虚拟机 | |
---|---|---|
原理 | 提供docker引擎,所有容器共用一个内核,而又通过引擎在不同的操作系统中独立运行 | 模拟操作系统,每个虚拟机都有各自的完整内核 |
优势 | 更便于在不同环境测试脚本,比虚拟机轻量 | 具有完整的操作系统,可以对系统配置进行操作修改和练习 |
从Dockerfile到容器
Dockerfile->image
.
是相对路径,这里说明是在Dockerfile指定的工作目录、根目录下进行构建
docker build . // docker引擎查找Dockerfile并构建镜像
[-t],意为tag,可以在构建时直接命名镜像
docker build -t bisa/test:v1.0 .
image
查看所有镜像
docker images
会出现类似下面的显示:
自定义镜像的名称
docker tag [IMAGE_ID] [REPOSITORY]:[TAG]
- REPOSITORY:镜像的名字。如果想要把镜像上传到镜像仓库自己的账户里,通常用
user/image_name
的形式命名,user
是账户名 - TAG:版本号。如果不进行标注,则会默认为
lateset
,就像上图的hello-world一样
比如我想把hello-world重命名为hi-docker
,tag为v1.0
,并传到bisa
的镜像仓库里:
docker tag feb bisa/hi-docker:v1.0 // 重命名
docker login // 在本机上登录docker的账户(输入账户名和密码)
docker push bisa/hi-docker:v1.0 // 上传到镜像仓库
镜像的ID在镜像不多的时候可以只写前几位,只要能识别出是它就行
删除镜像(remove image:rmi)
当镜像相同时ID也会相同,可以用镜像名字指定要删除的镜像;下文中出现的所有名字都可以在id不冲突时用id代替
docker rmi -f bisa/hi-docker:v1.0
image->container
docker run [RESPOSITORY]
- [-d],detached mode:使容器在后台运行,不占用当前命令行窗口
container
查看容器运行情况
docker ps // 查看容器运行情况
docker ps -a // 查看所有容器运行情况
给容器命名
否则随机给名字
docker run --name 容器名字 镜像名字
同步本地和容器
想把容器中的源码和本地同步,可以进行把本地的文件夹和容器中的文件夹进行绑定;注意这里的路径都要绝对路径
而有些文件是不能进行绑定的:本地的module文件会直接覆盖掉容器中的,而本地的文件没了,容器的文件也就没了
docker run -v 本地工作目录1:容器的工作目录1 镜像名字 // 绑定本地文件夹1和容器工作文件夹1
docker run -v 本地工作目录1:容器的工作目录1:ro -v 容器工作目录2 镜像名字 // 绑定本地文件夹1和容器工作文件夹1,但不同步容器工作目录2的内容,同时容器中的修改不可以影响本地
- [-v],volume
- [:ro],read_only
当重启容器的服务后,则可以看到绑定的变化
进入容器并进行交互
docker exec -it 容器名字 /bin/bash
- exec,execute:类似docker run
- [-i],interactive:交互
- [-t],pseudo-TTY:伪终端
- /bin/bash:执行一个新的bash
退出容器
exit
删除容器
docker rm -fv 容器名
- [-f],force:强制删除,无论是否容器正在运行
- [-v]:把对应的绑定也删除
端口号的对应问题
容器使用的端口号可能和本地所用的端口号不同,所以需要做端口映射
在Dockerfile中EXPOSS 端口号
只是一个说明、给人看的,实际确定服务使用的端口还是由源码设置的
docker run -p 主机端口:容器端口 镜像名
docker_compose
用来做容器管理的,以免每次容器启动都要写一长串命令
创建docker-compose.yml
,用于声明容器的配置。类似hexo搭博客的yml配置文件
启动容器
docker-compose up -d --build
- [--build],会在yml修改时,按照镜像重建容器;不然还会使用原本容器的缓存
删除容器
docker-compose down -v