这本gitbook,全面实用,很多步骤在这里头说明得比较详细
https://github.com/yeasy/docker_practice
基本概念理解
http://dockone.io/article/101
三个组件分别是:
Docker Client是用户界面,它支持用户与Docker Daemon之间通信。
Docker Daemon运行于主机上,处理服务请求。
Docker Index是中央registry,支持拥有公有与私有访问权限的Docker容器镜像的备份。
三个基本要素分别是:
Docker Containers负责应用程序的运行,包括操作系统、用户添加的文件以及元数据。
Docker Images是一个只读模板,用来运行Docker容器。
DockerFile是文件指令集,用来说明如何自动创建Docker镜像。
个人理解:
Docker | 虚拟机 | OOP |
---|---|---|
镜像 | 虚拟机镜像 | 类 |
容器 | VM | 实例 |
具体步骤记录
安装与配置
- 安装Docker,即DockerClient
https://download.docker.com/mac/stable/Docker.dmg - 正常安装看到应用显示Docker is running后进入命令行验证
ocean-mac:~ gregocean$ docker --version
Docker version 18.09.2, build 6247962
- 配置镜像加速
使用阿里云(公司给的账号,没有账号可以使用其他加速器,gitbook中有),找到镜像加速器,拷贝地址。
进入应用preferences->daemon->Registry Mirror填入加速地址,Apply&Restart
检查是否生效
docker info | grep -A 1 "Registry Mirrors"
- 下载、操作镜像
进入https://hub.docker.com
搜索nginx
在右上角拷贝指令docker pull nginx
目前还没有参数指定下载的本地地址,真实本地地址与原理见该博客:
https://www.cnblogs.com/cag2050/p/10100899.html
docker image ls //查看已下载的镜像
docker system df //列出镜像、容器等空间信息
docker image rm //删除镜像
Container容器
- 操作container
docker run -d -p 8000:80 --name webserver nginx // 启动镜像nginx的容器
// webserver是容器NAME
// -d 是daemon
// -p 是本机端口映射到容器端口
在浏览器localhost:8000就能看到nginx页面了。
ocean-mac:~ gregocean$ docker ps //查看当前运行container
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a68825a364d9 nginx "nginx -g 'daemon of…" 39 minutes ago Up 39 minutes 0.0.0.0:80->80/tcp webserver
ocean-mac:~ gregocean$ docker stop webserver //停止容器运行
webserver
停止后想继续启动Container,报错
ocean-mac:~ gregocean$ docker run -d -p 8000:80 --name webserver nginx
docker: Error response from daemon: Conflict. The container name "/webserver" is already in use by container "00d9e4a4811c9ada86d638fe13165fcd03bf2b28f7274462def7668488d8ec9a". You have to remove (or rename) that container to be able to reuse that name.
需要使用
ocean-mac:~ gregocean$ docker ps -a // -a :显示所有的容器,包括未运行的。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
00d9e4a4811c nginx "nginx -g 'daemon of…" 4 hours ago Exited (0) 4 hours ago webserver
所以是命名冲突了,关于Docker的命名空间,可以看:https://www.cnblogs.com/ohgenlong/articles/8595878.html
docker rm webserver // 删除此容器
使用上述指令后可以重新启动Container,但问题是如何重启我stop后容器而不用删除呢,如图所示,不用rm,就能让stop状态的container变为running:docker start webserver
- 进入容器
ocean-mac:~ gregocean$ docker exec -it webserver /bin/bash # 以bash方式进入
root@00d9e4a4811c:/# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
之后可以实验各种环境操作,模拟之后要在Dockerfile中进行的指令集,操作完exit退出。
Dockerfile与镜像构建
这里以一个Django项目为例(因为要部署的项目就是Django的)
django-admin startproject docker_django_example // 新建Django项目
cd docker_django_example
vim Dockerfile // 编写Dockerfile
基于各路资料编写Dockerfile,比如如何编写最佳Dockerfile
FROM centos:6.8
LABEL maintainer "[email protected]"
WORKDIR /usr/local/src
COPY . /usr/local/src
RUN yum -y update && \
yum -y install centos-release-scl && yum clean all && \
yum -y install python27 && yum clean all && \
scl enable python27 bash && \
yum -y install epel-release && yum clean all && \
yum -y install python-pip && yum clean all && \
pip install -r requirements.txt --index-url=http://pypi.douban.com/simple --trusted-host=pypi.douban.com
CMD ["python", "/usr/local/src/manage.py", "runserver", "0.0.0.0:8080"]
EXPOSE 8080
这里主要是把代码拷贝进WORKDIR、安装python与pip、再用pip装依赖包、最后是启动指令。
docker build -t docker_django_example . // 构建镜像
// 启动,就能在localhost看到django页面了
docker run -it -p 80:8080 --name django_example docker_django_example
Docker Registry操作
- 使用官方容器运行本地Registry
docker run -d -p 5000:5000 registry
- 使用tag标记该镜像
docker tag docker_django_example 127.0.0.1:5000/myimage/docker_django_example:v1
- 推送本地镜像到本地仓库
docker push 127.0.0.1:5000/myimage/docker_django_example
- 查看本地仓库的镜像列表
> curl 127.0.0.1:5000/v2/_catalog
{"repositories":["myimage/docker_django_example"]}
5.删除本地镜像然后从Registry下载
ocean-mac:docker_django_example gregocean$ docker rmi 8504b1971760
Error response from daemon: conflict: unable to delete 8504b1971760 (must be forced) - image is referenced in multiple repositories
仔细观察发现这俩的ImageID竟然一样
ocean-mac:docker_django_example gregocean$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
127.0.0.1:5000/myimage/docker_django_example v1 8504b1971760 14 hours ago 588MB
docker_django_example latest 8504b1971760 14 hours ago 588MB
可以使用REPOSITORY:TAG进行删除,然后再下载
ocean-mac:docker_django_example gregocean$ docker rmi 127.0.0.1:5000/myimage/docker_django_example:v1
Untagged: 127.0.0.1:5000/myimage/docker_django_example:v1
Untagged: 127.0.0.1:5000/myimage/docker_django_example@sha256:358f10c97bad61b6ed1b4b3f8999b7a1fa45c510a23f3722a79d3c37424b1b04
// 从Repository下载镜像
ocean-mac:docker_django_example gregocean$ docker pull 127.0.0.1:5000/myimage/docker_django_example:v1
v1: Pulling from myimage/docker_django_example
Digest: sha256:358f10c97bad61b6ed1b4b3f8999b7a1fa45c510a23f3722a79d3c37424b1b04
Status: Downloaded newer image for 127.0.0.1:5000/myimage/docker_django_example:v1
Docker Compose
“Compose默认管理对象是项目”,定位是“定义和运行多个Docker容器的应用”。
两个重要概念:
- 服务(Service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。(个人理解是n个同镜像的容器集合组成一个实际可用的服务)。
- 项目(project):由一组关联的应用容器组成的一个完整业务单元,使用docker-compose.yml文件定义。
从技术角度讲,你可以在 Docker 容器中运行多个进程。你可以将数据库,前端,后端,ssh,supervisor 都运行在同一个 Docker 容器中。但是,这会让你非常痛苦:
- 非常长的构建时间(修改前端之后,整个后端也需要重新构建)
- 非常大的镜像大小
- 多个应用的日志难以处理(不能直接使用 stdout,否则多个应用的日志会混合到一起)
- 横向扩展时非常浪费资源(不同的应用需要运行的容器数并不相同)
- 僵尸进程问题 - 你需要选择合适的 init 进程
因此,我建议大家为每个应用构建单独的 Docker 镜像,然后使用 Docker Compose 运行多个 Docker 容器。
mac下安装好docker可以直接使用Compose:docker-compose --version
To Be Continued.