Docker之从零开始制作docker镜像
以前学习docker是直接docker pull命令直接拉取Linux中已有镜像,并创建容器,添加应用程序,但是docker镜像一开始是怎么来的呢?下面将从零开始介绍整个docker镜像的制作过程(初始镜像以Ubuntu16.04为例)。
一、制作ubuntu的基础镜像
方法一:
(1)拉取Docker中的ubuntu镜像,docker pull ubuntu:16.04;
(2)创建Docker容器,docker run --priviledge --name=huangyu --net=host -it unbuntu:16.04
(3)将pull下来的镜像提交到本地,docker commit <容器ID> <镜像名称>:<Tag>
由于公司使用内网工作,使用docker pull命令失败,下面将介绍另一种通用方式
方法二:
(1)下载Ubuntun16.04初始镜像ubuntu-xenial-core-cloudimg-amd64-root.tar.gz到服务器Z:/mydocker中。
下载地址:http://cloud-images.ubuntu.com/minimal/releases/xenial/release/
镜像文件下载地址为:https://github.com/tianon/docker-brew-ubuntu-core/blob/857debd4347496c541f9806c084710dace49cd27/xenial/Dockerfile
(2)创建初始ubuntu镜像
a.切换到mydocker目录 cd mydocker
b.将ubuntu-xenial-core-cloudimg-amd64-root.tar.gz拷贝至mydocker目录下,解压 tar -zxvf ubuntu-xenial-core-cloudimg-amd64-root.tar.gz
c.因公司屏蔽外网源,这里需要修改apt-get为公司的源,找到/etc/apt/sources.list文件并更新为公司的源
d.创建Dockerfile文件,注意文件名只能为Dockerfile,使用命令touch Dockerfile;(这里与Dockfile相关的知识会在下一篇博文中介绍)
FROM scratch
ADD ubuntu-xenial-core-cloudimg-amd64-root / # a few minor docker-specific tweaks
# see https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap
RUN set -xe \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L40-L48
&& echo '#!/bin/sh' > /usr/sbin/policy-rc.d \
&& echo 'exit 101' >> /usr/sbin/policy-rc.d \
&& chmod +x /usr/sbin/policy-rc.d \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L54-L56
&& dpkg-divert --local --rename --add /sbin/initctl \
&& cp -a /usr/sbin/policy-rc.d /sbin/initctl \
&& sed -i 's/^exit.*/exit 0/' /sbin/initctl \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L71-L78
&& echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L85-L105
&& echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \
&& echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \
&& echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L109-L115
&& echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L118-L130
&& echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes \
\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L134-L151
&& echo 'Apt::AutoRemove::SuggestsImportant "false";' > /etc/apt/apt.conf.d/docker-autoremove-suggests # delete all the apt list files since they're big and get stale quickly
RUN rm -rf /var/lib/apt/lists/*
# this forces "apt-get update" in dependent images, which is also good # enable the universe
RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list # make systemd-detect-virt return "docker"
# See: https://github.com/systemd/systemd/blob/aa0c34279ee40bce2f9681b496922dedbadfca19/src/basic/virt.c#L434
RUN mkdir -p /run/systemd && echo 'docker' > /run/systemd/container # overwrite this with 'CMD []' in a dependent Dockerfile
CMD ["/bin/bash"]
e.创建docker镜像 docker build -t un:un .(注意这里的.代表会在当前目录下自动寻找Dockerfile文件)
. 表示上下文路径,是指docker在构建镜像,有时候想要使用到本机的文件(比如复制),docker build命令得知这个路径后,会将路径下的所有内容打包。
d.因公司屏蔽外网源,这里需要修改apt-get为公司的源,具体步骤如下
(1)创建容器,docker run --privileged --name=huangyu --net=host -v ~:share ubuntu:16:04
(2)下载vim,apt install vim
(3)修改源文件,vim /etc/apt/sources.list后保存
(4)Crtl+D退出docker,docke ps -a|grep huangyu 查看容器ID
(5)推送新镜像,docker commit -a "huangyu" -m "ubuntu" ID un:un
f.以un:un镜像为基础,创建unbuntu+python3的镜像;
(1)进入mydocker目录,cd mydocker
(2)创建新文件夹,mkdir pythonfile
(3)下载python的tar.xz文件,并拷贝至pythonfile文件夹下
(4)切换至pythonfile目录下并创建新文件,cd pythonfile, touch Dockerfile
From un:un
ADD Python-3.7.6.tar.xz /
#卸载并且删除python相关配置
RUN apt-get purge -y python.*
#第一个RUN解决apt源更新失败问题
RUN set -ex \
&& chmod 777 /tmp \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean \
&& apt-get autoremove \
&& apt-get autoclean \
#&& apt-get update --allow-unauthenticated\
&& apt-get update \
&& apt-get install -y build-essential checkinstall libssl-dev libreadline-dev libffi-dev libsqlite3-dev tk-dev libgdbm-dev libbz2-dev libncurses5-dev liblzma-dev uuid-dev RUN set -ex \
#&& wget https://www.python.org/ftp/python/3.7.6/Python-3.7.6.tgz \ (内网下载很慢,需要先在下载)
#&& tar -xf Python-3.7.6.tar.xz \
&& cd Python-3.7.6 \
#编译
&& ./configure prefix=/usr/local/python3 \
#安装
&& make \
&& make install \
#清除make命令产生的object文件(后缀为".o"的文件)及可执行文件
&& make clean \
&& cd .. \
&& rm -rf /Python-3.7.6* \
#&& apt install -y epel-release \
&& apt install -y python-pip CMD ["hello.py"]
(5)创建docker镜像 docker build -t ubuntu:python .
(6)使用docker images,查看有无ubuntu:python的镜像
需要注意的几点
1.RUN set -ex \ 的作用
set -ex作用就是,当下面的命令执行出错后,就退出执行,不在继续往下执行。2.Dockerfile 的ADD 和COPY 的区别:
ADD 可以实现从远程的某个指定的url上下载文件,然后添加到容器的系统文件目录中。ADD可以将本地可识别的压缩文件解压到容器的指定路径上(但是URL下载和解压不能同时进行,任何通过远程URL下载的压缩文件,都只能拷贝到容器中,不会自动解压)ADD的一个简化版本,它只会复制文件到容器中Docker之从零开始制作docker镜像的更多相关文章
- Docker将容器制作成镜像并提交到远程仓库
Docker将容器制作成镜像并提交到远程仓库 步骤如下 先在dockerhub上创建一个自己的用户https://hub.docker.com/.或者在阿里云也可以. 2. 然后先创建一个空的镜像名. ...
- Docker 从零开始制作基础镜像[centos]
http://www.oschina.net/news/62897/docker-hub-contains-high-risk-vulnerabilities 这里有个统计,docker官方和个人发布 ...
- Docker之dockerfile制作jdk镜像
目的: Dockerfile简介 Dockerfile制作jdk镜像 Dockerfile简介 了解dockerfile之前要先了解Docker基本概念和使用可参考:https://www.cnblo ...
- Docker之Alpine制作jre镜像(瘦身)+自定义镜像上传阿里云
alpine制作jdk镜像 alpine Linux简介 1.Alpine Linux是一个轻型Linux发行版,它不同于通常的Linux发行版,Alpine采用了musl libc 和 BusyBo ...
- 使用docker 基于centos7制作mysql镜像
说明:由于业务需要使用centos7.6+mysql5.7+jdk8以及其他的java程序,本想在网上找一个现成的,发现镜像都不适合我. 一.yum方式安装mysql 1.编写dockerfile文件 ...
- 制作Docker镜像的两种方式
此文已由作者朱笑天授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.使用docker commit命令制作docker镜像 1. pull一个centos6.6的基础镜像, ...
- docker中如何制作自己的基础镜像
一.本地镜像 举个例子:现在把自己的开发环境打包,取名为centos6-base.tar,然后在docker中,以centos6-base.tar作为基准镜像. 1.创建自己的镜像,放置于/root目 ...
- 从零开始构建docker基础镜像
段子 今年基本已经结束了,我问了很多朋友今年挣钱了没?大多朋友都有挣,而且挣得五花八门:有挣个屁的,有挣个锤子的,有挣个毛的,更有甚者挣个妹的,奢侈之极!最恐怖的是挣个鬼的!有的还可以,挣个球,下午我 ...
- 【玩转开源】制作Docker镜像
做嵌入式方向经常会遇到的一个问题,就是编译环境安装,如果换电脑,再重新安装环境是一个比较费时的事情,这个时候可以自己制作一个Docker镜像,然后把编译环境在Docker镜像里面配置好,以后同步环境就 ...
随机推荐
- Spring基于注解@Required配置
基于注解的配置 从 Spring 2.5 开始就可以使用注解来配置依赖注入.而不是采用 XML 来描述一个 bean 连线,你可以使用相关类,方法或字段声明的注解,将 bean 配置移动到组件类本身. ...
- zabbix 微信告警机制
微信告警首先得注册一个企业微信,然后才能实现微信告警.自行百度 微信: 添加一个用户到上面创建的部门里面 创建完成记住 AgentID 和 Secret 下一步:记住企业 ID 1)编辑zabbix ...
- c语言----- 冒泡排序 for while do-while 递归练习
1. 冒泡排序简介(默认从小到大排序) 核心思想:只比较相邻的两个元素,如果满足条件就交换 5 8 2 1 6 9 4 3 7 0 目标:0 1 2 3 4 5 6 7 8 9 第一次排序: 5 ...
- 【Linux常见命令】xargs命令
xargs - build and execute command lines from standard input. 从标准输入< 方向获取数据,再创建和执行命令 xargs 是给命令传递参 ...
- mac OS 配置Apache服务器
Mac自带了Apache环境 查看Apache版本 sudo apachectl -v 在终端输入:sudo apachectl start 在浏览器输入"http://localhost& ...
- react 工程起步 安装chrome 开发调试工具 react developer tools 及初建一个react 项目...
1.安装react 开发工具 1.下载 chrome react developer tools 下载地址:https://pan.baidu.com/s/1eSZsXDC 下载好是 ...
- 《PostgreSQL服务器编程》一一1.3 超越简单函数
本节书摘来自华章计算机<PostgreSQL服务器编程>一书中的第1章,第1.3节,作者:(美)Hannu Krosing, Jim Mlodgenski, Kirk Roybal 著,更 ...
- Greenplum列存压缩表索引机制
列存压缩表,简称AOCS表 数据生成 create table testao(date text, time text, open float, high float, low float, volu ...
- 使用BottomNavigationView+ViewPager+Fragment的底部导航栏
2019独角兽企业重金招聘Python工程师标准>>> 使用BottomNavigationView做底部工具栏,使用ViewPager做页面切换,使用Fragment完成每个页面的 ...
- 最简单,最明了,看了就会的VScode和C++的配置!(Visual Studio Code)
我看了网上的大佬们配的我是在是看不懂啊?我是一个小白啊?这太难了,这阻挡不了我,想使用这很骚的IDE,于是在不断的摸索下,终于配置成功,小白们也不用慌,这次非常简单.一定可以的. 1.下载 VS Co ...