Mac环境Docker入门实践

这本gitbook,全面实用,很多步骤在这里头说明得比较详细
https://github.com/yeasy/docker_practice

Docker指令与状态转换.png

基本概念理解

http://dockone.io/article/101

三个组件分别是:
Docker Client是用户界面,它支持用户与Docker Daemon之间通信。
Docker Daemon运行于主机上,处理服务请求。
Docker Index是中央registry,支持拥有公有与私有访问权限的Docker容器镜像的备份。
三个基本要素分别是:
Docker Containers负责应用程序的运行,包括操作系统、用户添加的文件以及元数据。
Docker Images是一个只读模板,用来运行Docker容器。
DockerFile是文件指令集,用来说明如何自动创建Docker镜像。

HowTheyInteract.png

个人理解:

Docker 虚拟机 OOP
镜像 虚拟机镜像
容器 VM 实例

具体步骤记录

安装与配置

  1. 安装Docker,即DockerClient
    https://download.docker.com/mac/stable/Docker.dmg
  2. 正常安装看到应用显示Docker is running后进入命令行验证
ocean-mac:~ gregocean$ docker --version
Docker version 18.09.2, build 6247962
  1. 配置镜像加速
    使用阿里云(公司给的账号,没有账号可以使用其他加速器,gitbook中有),找到镜像加速器,拷贝地址。
    进入应用preferences->daemon->Registry Mirror填入加速地址,Apply&Restart
    检查是否生效
docker info | grep -A 1 "Registry Mirrors"
  1. 下载、操作镜像
    进入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容器

  1. 操作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

  1. 进入容器
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操作

  1. 使用官方容器运行本地Registrydocker run -d -p 5000:5000 registry
  2. 使用tag标记该镜像docker tag docker_django_example 127.0.0.1:5000/myimage/docker_django_example:v1
  3. 推送本地镜像到本地仓库docker push 127.0.0.1:5000/myimage/docker_django_example
  4. 查看本地仓库的镜像列表
> 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容器的应用”。
两个重要概念:

  1. 服务(Service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。(个人理解是n个同镜像的容器集合组成一个实际可用的服务)。
  2. 项目(project):由一组关联的应用容器组成的一个完整业务单元,使用docker-compose.yml文件定义。

从技术角度讲,你可以在 Docker 容器中运行多个进程。你可以将数据库,前端,后端,ssh,supervisor 都运行在同一个 Docker 容器中。但是,这会让你非常痛苦:

  • 非常长的构建时间(修改前端之后,整个后端也需要重新构建)
  • 非常大的镜像大小
  • 多个应用的日志难以处理(不能直接使用 stdout,否则多个应用的日志会混合到一起)
  • 横向扩展时非常浪费资源(不同的应用需要运行的容器数并不相同)
  • 僵尸进程问题 - 你需要选择合适的 init 进程
    因此,我建议大家为每个应用构建单独的 Docker 镜像,然后使用 Docker Compose 运行多个 Docker 容器。

mac下安装好docker可以直接使用Compose:docker-compose --version

To Be Continued.

你可能感兴趣的:(Mac环境Docker入门实践)