这是一个开始使用 Docker 的 Tutorial

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

Docker 的好处

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

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

1. 安装 Docker

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

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

其他系统可以参考官网

https://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 \
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/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:
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/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账号 , 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/96858321

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

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

Keep curious, keep learning

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

求求你了,用Docker吧的更多相关文章

  1. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  2. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  3. Docker 第一篇--初识docker

    已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...

  4. 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)

    环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...

  5. docker for mac 学习记录

    docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...

  6. scrapy爬虫docker部署

    spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...

  7. [原][Docker]特性与原理解析

    Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...

  8. 开发者的利器:Docker 理解与使用

    困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...

  9. 使用python自动生成docker nginx反向代理配置

    由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...

随机推荐

  1. struts2的初步认识

    Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互. 一. Str ...

  2. 三剑客之awk 逐行读取

    目录: 一.awk工作原理 二.按行输出文本 三.按字段输出文本 四.通过管道,双引号调用shall命令 五.CPU使用率 六.使用awk 统计 httpd 访问日志中每个客户端IP的出现次数 一.a ...

  3. 74cms v3.3 后台SQL注入

    注入存在于后台 admin_baiduxml.php 代码 52-63行 elseif($act == 'setsave') { $_POST['xmlmax']=intval($_POST['xml ...

  4. IO流实现简单的文件的剪切

    思路: 判断 即将 复制的文件是文件夹还是文件 遍历需要复制的源文件夹 如果是文件夹,就通过流创建一个同样的子文件夹 如果是文件,就复制过去 接下来上代码 public class Demo1 { p ...

  5. Java环境搭建与HelloWprld—改变世界的第一步

    1. JDK下载 访问oracle官网:http://www.oracle.com 在首页点击Downloads,进入oracle软件下载页. 在下载页面,点击Java. 选择Java (JDK) f ...

  6. docker-compose 的使用和负载均衡的初探

    docker-compose 的使用和负载均衡的初探 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云服务器 c. 上一篇:Docker 私有仓库 1. ...

  7. 【PHP数据结构】栈和队列的应用

    通过栈和队列的学习,我们似乎会感觉到其实数据结构还是非常简单的嘛.当然,这只是一个开始,我们从顺序表.链表开始,到现在的栈和队列,其实都是为了将来在铺路.在树和图的遍历算法中,都可以见到栈和队列的身影 ...

  8. python学习笔记(三)-列表&字典

    列表: 一.列表操作"""Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素.比如,列出班里所有同学的名字,就可以用一 ...

  9. RabbitMQ3.9.7在CentOS7中的安装搭建

    1.概述 RabbitMQ 是目前很流行的消息中间件之一,可靠性非常好,能简单的实现高可用.负载均衡. 今天我们先来聊一下 RabbitMQ 3.9.7 版本在 CentOS7 中的安装. 2.安装R ...

  10. 深入浅出WPF-11.Template(模板)02

    模板 DataTemplate和ControlTemplate的关系 通过上面的内容,控件只是一个数据和行为的载体,是一个抽象的概念,至于它长什么样子,或者它的数据是怎么展示的,都是由模板生成的.决定 ...