求求你了,用Docker吧

  • 2021 年 10 月 25 日
  • 筆記

这是一个开始使用 Docker 的 Tutorial

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

Docker 的好处

粗浅的说,Docker 是一个生产效率工具,他最大的应用价值是抹平不同机器,不同系统的差距,所有程序运行在Docker的平台下,就可以做到两件很重要的事:

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

download

1. 安装 Docker

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

正常情况下, 只需要配置docker源+ 安装最新版两步, 下面给出卸载老版本, 安装指定版本的方法进行拓展学习。

其他系统可以参考官网

//docs.docker.com/get-docker/

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 \
    //download.docker.com/linux/centos/docker-ce.repo # 配置

安装最新版的docker

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

安装好了之后可以和开头一样使用docker version验证是否安装成功

docker version

image-20211020114826283

如果想要安装特定版本可以采用一下方式

  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 : //linux.51yip.com/search/systemctl

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:
 //hub.docker.com/

For more examples and ideas, visit:
 //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

image-20210316135024465

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

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

查看docker中的镜像

docker images

image-20210316135204030

-m指定说明信息

-a指定用户信息

3a2ed26119d3 代表容器的id

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

现在我们可以使用新保存的镜像创建一个包含git的centos容器

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

image-20210316135523477

2.3 停止容器和删除镜像

现在把之前下载的hello-world删了

删除镜像之前要停止所有基于镜像的容器

查看运行中的容器

docker ps -a

停止这些容器

docker rm 9f069

然后查看运行中的容器, 没有对应镜像的容器就可以删除镜像

image-20210316140341394

查看镜像

docker images

image-20210316140459418

删除镜像

docekr rmi d1165

image-20210316140521866

3. 利用Dockerfile创建镜像

Dockerfile是一种配置文件, 可以看作批处理脚本, 但是是以一种配置化的形式进行编写

官方说明 //docs.docker.com/engine/reference/builder/

新建一个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账号 , //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 //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. 拓展阅读

深入原理 //zhuanlan.zhihu.com/p/96858321

减小你的镜像体积 //zhuanlan.zhihu.com/p/115845957

docker 常用操作总结 //www.docker.org.cn/dockerppt/106.html

Keep curious, keep learning

【Jeff 在写代码】有关代码的一切的一切