乐趣区

关于程序员:求求你了用Docker吧

这是一个开始应用 Docker 的 Tutorial

大无语事件产生!大数据课实验课要用到 Hadoop,试验领导是在一个 Unbuntu 虚机上通过安装包装置 Hadoop 并运行一个词频统计程序,整个试验就是装置环境,做了 4h 才把环境搭好。因为我不想装虚拟机用 centos 云服务器的,期间遇到 centos 没有 sudo 用户组问题,遇到文件目录构造不一样等等各种问题,在解决这些问题上消磨了大量工夫精力,而在解决这些问题的时候却没有实质性的常识晋升和成果产出。每每在这个时候我就想,要是有 Docker 就好了。

Docker 的益处

浅显的说,Docker 是一个生产效率工具,他最大的利用价值是抹平不同机器,不同零碎的差距,所有程序运行在 Docker 的平台下,就能够做到两件很重要的事:

  1. 简化开发环境配置
  2. 不便不同零碎(Linux 服务器,Mac 或者 Windows 开发机),不同环境(生产环境,预发环境和开发环境)的程序部署迁徙

1. 装置 Docker

因为在不同环境中装置有不同的形式,Docker 官网的指引很好,所以在这里给出装置形式的文档链接和在 Centos 下装置的流程。

失常状况下, 只须要配置 docker 源 + 装置最新版两步, 上面给出卸载老版本, 装置指定版本的办法进行拓展学习。

其余零碎能够参考官网

https://docs.docker.com/get-d…

1.1 Centos 环境下装置 Docker

装置之前能够先查看一下是否已装置 docker

docker version # 查看 Docker 版本, 验证是否已装 Docker

如果已装置, 能够尝试卸载 Docker

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine # 卸载老版本 Docker

/etc/systemd -name '*docker*' -exec rm -f {} ; #革除配置文件和依赖文件

find /etc/systemd -name '*docker*' -exec rm -f {} \;

find /lib/systemd -name '*docker*' -exec rm -f {} \;

在下载 docker 之前, 最好装置 yumutils, 并配置yumutilsyum-config-manager来设置稳定版的仓库 / 源, 不便之后的更新

yum install -y yum-utils # 装置

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo # 配置

装置最新版的 docker

sudo yum install docker-ce docker-ce-cli containerd.io

装置好了之后能够和结尾一样应用 docker version 验证是否装置胜利

docker version

如果想要装置特定版本能够采纳一下形式

  1. 查看能应用的版本

     yum list docker-ce --showduplicates | sort -r
  2. 装置特定版本

     yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

2. 意识 Docker

装好了 docker 先跑起来吧

systemctl start docker

这条命令启动 docker 服务, 相似 windows 中的服务, 始终运行在后盾提供性能, 也就是以一种非凡的, 受爱护的模式运行 docker 本体

对于 systemctl : http://linux.51yip.com/search…

docker run hello-world

这条命令将会下载 hello-world 镜像并运行

而后你就会看到一些阐明文字

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

2.1 Docker 的基本概念

  1. 镜像(Image):是一个蕴含有文件系统的面向 Docker 引擎的只读模板。镜像是一个模板, 装了一些零碎的配置文件, 咱们能够通过镜像建设更多的容器, 容器从镜像启动时,Docker 在镜像的下层创立一个可写层, 镜像自身不变。
  2. 容器(Container):容器是基于镜像创立, 互相隔离的, 能够了解为小型虚拟机,真正的执行单元。
  3. 仓库(Repository):寄存镜像的仓库
  4. 注册服务器(Registry)的区别:注册服务器是寄存仓库的中央,个别会有多个仓库;而仓库是寄存镜像的中央,个别每个仓库寄存一类镜像,每个镜像利用 tag 进行辨别. Docker Hub是 Docker 公司提供的一个注册服务器(Register)来保留多个仓库

2.2 启动一个装有 Centos 的 Docker 容器

2.2.1 下载镜像

在 DockerHub 查找 centos 的镜像并拉取 centos 镜像

docker search ubuntu  # 查看
docker pull centos # 拉取

查看 docker 中的所有镜像

docker images    # 查看以后零碎中的 images 信息
# 会取得上面信息
# REPOSITORY  TAG     IMAGE ID      CREATED       SIZE
# centos      latest  0584b3d2cf6d  9 days ago    196.5 MB

2.2.2 启动容器

docker run -it centos:latest /bin/bash    # 启动一个容器

run 运行容器

-it 应用交互模式运行容器并且调配一个伪输出终端

centos:latest 指定启动的容器的镜像

/bin/bash 是启动容器后运行的指令

2.2.3 在 Docker 的 Centos 中装置 git 并保留镜像

git --version    # 此时的容器中没有 git
# bash: git: command not found

yum install git    # 利用 yum 装置 git

git --version   # 此时的容器中曾经装有 git 了
# git version 1.8.3.1

退出容器并查看运行中的容器

docker ps -a

将一个容器转化成镜像保存起来

docker commit -m "centos with git" -a "zjeff" 3a2ed26119d3 zjeff/centos:git

查看 docker 中的镜像

docker images

- m 指定阐明信息

- a 指定用户信息

3a2ed26119d3 代表容器的 id

zjeff/centos:git 指定指标镜像的用户名、仓库名和 tag 信息

当初咱们能够应用新保留的镜像创立一个蕴含 git 的 centos 容器

docker run -it zjeff/centos:git /bin/bash

2.3 进行容器和删除镜像

当初把之前下载的 hello-world 删了

删除镜像之前要进行所有基于镜像的容器

查看运行中的容器

docker ps -a

进行这些容器

docker rm 9f069

而后查看运行中的容器, 没有对应镜像的容器就能够删除镜像

查看镜像

docker images

删除镜像

docekr rmi d1165

3. 利用 Dockerfile 创立镜像

Dockerfile 是一种配置文件, 能够看作批处理脚本, 然而是以一种配置化的模式进行编写

官网阐明 https://docs.docker.com/engin…

新建一个 Dockerfile 文件(无后缀), 写入上面内容

# 抉择一个镜像作为根底
FROM centos:latest

# 维护者的信息
MAINTAINER zjeff

# 启动镜像后进行的操作
RUN yum update -y
RUN yum install -y git

# 拷贝本地文件到镜像中
COPY ./* /usr/share/gitdir/
# 后面是容器中的门路, 前面是本地门路

应用 Dockerfile 新建一个镜像

docker build -t="zjeff/centos:gitdir" .

t 用来指定新镜像的用户信息、tag 等

最初的点示意在当前目录寻找 Dockerfile

构建实现之后,能够应用 docker images 命令查看

如果提醒不是 root 用户能够应用这条命令进入容器

docker exec -it --user root <container id> /bin/bash

如果你忘了加 -y 可能会提醒你输出 yes 提醒会进行构建镜像的过程

还有的时候不能应用 -y

如果是装置脚本的场合
比方咱们用 sh Anaconda3-4.4.0-Linux-x86_64.sh 来装置 anaconda 的时候,”烦人”的 anaconda 会问四个问题,我的答复程序别离是 Enter,yes,Enter,yes。于是你能够这样写:

RUN sh -c ‘/bin/echo -e “\nyes\nyes” | sh Anaconda3-4.4.0-Linux-x86_64.sh’

4. 镜像的文件备份和加载

docker save -o centos.tar zjeff/centos:git    
# 保留镜像, - o 也能够是 --output
docker load -i centos.tar    
# 加载镜像, - i 也能够是 --input

5. Docker 的 罕用操作

run 能够运行一个镜像, 创立一个容器 , 之前曾经用过了

当初补充一下后盾运行和日志的用法

docker run -d xxxx

这样就能够后盾运行一个容器

后盾启动一个容器后,如果想进入到这个容器,能够应用 attach 命令:

docker attach container_name/container_id

删除

docker rm container_name/container_id

启动, 进行 , 重启容器

docker start container_name/container_id 
docker stop container_name/container_id
docker restart container_name/container_id

6. 应用 DockerHub 保留你的镜像

  1. 注册一个 DockerHub 账号 , https://hub.docker.com/
  2. 登录
docker login

# Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
# Username: zjeff
# Password:
# Login Succeeded
  1. 推送

推送的时候, 要把用户名和登录名统一

docker push zjeff/centos:git    # 胜利推送
docker push xxx/centos:git    # 失败
# The push refers to a repository [docker.io/xxx/centos]
# unauthorized: authentication required
  1. pull 镜像
docker pull zjeff/centos:git

7. 拓展浏览

深刻原理 https://zhuanlan.zhihu.com/p/…

减小你的镜像体积 https://zhuanlan.zhihu.com/p/…

docker 罕用操作总结 https://www.docker.org.cn/doc…

Keep curious, keep learning

【Jeff 在写代码】无关代码的所有的所有

退出移动版