docker入门总结,从使用的角度谈起

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: docker入门总结,从使用的角度谈起

大凡先进技术的产生,都不是凭空捏造的,更不是花花瓶子作秀博眼球的。或是要解决某些需求,某些痛点。有其存在的道理和价值。


学习和使用一种技术,不是因为其高大上,好多大公司都在用就盲目去跟风,去学,去用。虽然开卷有益,多学习了解一点儿总是好的。但是,这样的效率不高,或者激不起学习的兴趣,或者太死板不能活学活用,学以致用。最好站在使用的角度去学习,实际操练一下,这是学习的一种方法。


上大学时学到傅里叶变换很枯燥。我站起来提问,问老师为啥要学习傅里叶变换?是为了考试通过吗?为了锻炼一下思维?能否讲讲它能用来做什么,实在不想死记硬背公式了,那样觉得就是为了应付考试。老师听了后,说同学你提的问题很好,很少有同学会问这个问题。然后就向我们讲了可以用在数字信号处理和图像处理等领域。同学们听过后都提高了不少兴趣,不再觉得枯燥了。


言归正传,关于docker,是这样解释的:


Docker 是一个开源的应用容器引擎,基于go语言 并遵从Apache2.0协议开源。


Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。


如果只是看了这个解释,然后去按照某个教程捣鼓捣鼓,可能过一段时间又忘了。一是激不起太大兴趣,二是不能发挥它的实用价值。


我的需求是这样的,


我有三套ARM开发板,板子上的芯片虽然都是ARM,但是架构和指令版本都是不一样的。


我使用的虚拟机是Ubuntu14.04,我想在上面搭建嵌入式linux的交叉编译环境,以及go语言的开发环境和针对嵌入式的开发环境。


还需要把同样搭建好的环境指导提供给其他同事用。其他同事虽然也装了虚拟机,但是装的linux系统各式各样,有cenOS,有Ubuntu等,有32位也有64位的。有低版本也有高版本的。


我要装三个虚拟机吗?我要要求他们都装同样的系统吗?我要指导他们都捣鼓一套交叉编译环境吗?


我在一个虚拟机上装三套环境行不?或许可行的,但是环境之前有冲突,搞不好就掉坑里了。就比如环境变量来说,该如何配置才能做到相互不影响才好?


或者第三方厂商说你正在使用的系统版本太低了不支持。我要把原来的东西备份再更新下系统吗?


哦,想想都累,太折腾了。装三个虚拟机太占资源,还得来回切换,不好管理。要求他们换系统也不现实。每个人都指导配置一遍环境,效率太低了。


这时,Docker就派上大用途了。


有了它,我可以把环境搭建好直接给他们使用,不管他们装的是什么版本的linux系统,不影响他们现有的环境。他们也无需去配置交叉编译环境了。能保证我这是什么样,给他们的就是什么样。


docker run -t -i ubuntu:14.04 /bin/bash ,我就有了14.04的系统和环境。


docker run -t -i ubuntu:15.10 /bin/bash ,就相当于我有了15.10的系统和环境。


且切换速度很快,不占用太多空间。


回想之前,让一个对接的厂家提供给我们一套工具链使用。乖乖嘞,他说让我提供个大空间的U盘或者邮箱地址。说是他的工具链和配置好的环境都在虚拟机镜像里,要把好几G的镜像文件拷贝给我。结果我在网上下载了半天,效率那叫一个低啊。


如果他们提供我个docker容器,就简单了。


第一步,下载安装。


我的系统是ubuntu14.04,64位的。安装方式有几种,网上有很多教程。我选择了一种简单的方式,


直接:


sudo apt-get install -y docker-ce


注:Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker。


通过 uname -r 命令查看你当前的内核版本。


然后想验证下有没有验证成功,输入:docker version,


刚开始提示找不到docker命令,明明安装没报错怎么找不到呢?


于是做了个软链接:ln -sf /usr/bin/docker /usr/local/bin/docker



这样就算成功了吗?运行个demo试试:


docker run hello-world,


结果出现


Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?


原来docker的服务没能成功启动,查看下是不是,


service docker status


最后参照网上的办法,解决了。



docker run -it ubuntu bash


发现无论怎么做 都会出现这种问题!而且docker启动后立即停止stop了



         


看一下确实启动了 但是之后sudo service docker status查看下 发现还是stop/waiting


ok!搞事情!


查了一堆博文都没解决问题,但是发现一篇博文中有个关于docker的日志路径23333


解决之道:


1、root@myubuntu:/var/lib/docker#?tail -f /var/log/upstart/docker.log


INFO[0000] containerd successfully booted in 0.001790s? ?module=containerd
time="2018-05-25T16:34:07.693705860+08:00" level=warning msg="failed to rename /var/lib/docker/tmp for background deletion: rename /var/lib/docker/tmp /var/lib/docker/tmp-old: file exists. Deleting synchronously"
Error starting daemon: error initializing graphdriver: /var/lib/docker contains several valid graphdrivers: overlay2, aufs; Please cleanup or explicitly choose storage driver (-s <DRIVER>)
^C


反正就是说存储驱动有点多,需要清理下或者强行指定存储驱动!因为它有点蠢!


2、root@myubuntu:/var/lib/docker#?cd /var/lib/docker


3、root@myubuntu:/var/lib/docker#?ls


root@myubuntu:/var/lib/docker# ls


aufs? builder? containerd? containers? graph? image? init? linkgraph.db? network? overlay2? plugins? repositories-aufs? runtimes? swarm? tmp? tmp-old? trust? volumes


4、root@myubuntu:/var/lib/docker#?rm -rf aufs


这一步冲动了点? 应该先mv开 然后试一下 防止出问题


关于为啥删除aufs请看后面的内容


5、root@myubuntu:/var/lib/docker


#service docker start


6、root@myubuntu:/var/lib/docker


#?service docker status


OK!


auf和overlay2是两种存储驱动,auf适用于linux内核小于4的系统,overlay2适用于linux内核>=4的系统



接下来,


service docker start


通过交互模式启动容器(容器启动后,直接进入容器中,退出按ctrl+D)


运行Docker容器


现在可以看到在Bash Shell下建立Ubuntu容器是非常简单的,只需运行一行命令即可。


-i选项:让输入输出都在标准控制台进行


-t选项:分配一个tty


# docker run -i -t ubuntu /bin/bash
root@696d5fd32bba:/#


故,在输出提示中,可以看到使用的标准Ubuntu容器。


现在可以在Ubuntu的Docker容器中使用Bash Shell。如果希望停止/断开连接,可以使用组合键Ctrl-p + Ctrl-q,然后就会返回到早先的窗口。


每次配置容器的参数不生效?需要从虚拟机往容器里拷文件怎么办?


挂载宿主机文件作为数据卷


docker run --name nginx-data3 -v /文件路径:/container路径 nginx


docker run -it --name imax283 -v /mnt/hgfs/b503/imax283:/imax283 ubuntu


--name 的含义为给容器起一个名字。


/mnt/hgfs/b503/imax283是我的本地文件存储的路径。


:/imax283是挂载在容器中显示的目录名。


后面的 ubuntu是指定的镜像。


查看有哪些镜像?可以用docker images


查看当前已存在哪些容器?


查看容器:


docker ps -a


想要进入对应容器的交互模式:


docker exec -it imax283 /bin/bash


这样就进入了名称为imax283的容器的交互模式


docker exec -it mygoenv /bin/bash


使用run命令创建容器


$ sudo docker run -dit [镜像:版本] [命令]


!-d: 表示后台运行


-i:允许你对容器内的标准输入 (STDIN) 进行交互。


-t:在新容器内指定一个伪终端或终端。


tar -cvf 123.tar include/


导入,导出容器


导出某个容器,非常简单,使用docker export命令,语法:docker export $container_id > 容器快照名


导入某个容器--docker import命令


有了容器快照之后,我们可以在想要的时候随时导入。导入快照使用docker import命令。


例如我们可以使用cat centos.tar | docker import - my/centos:v888 导入容器快照作为镜像


镜像保存/载入:docker load/docker save;将一个镜像导出为文件,再使用docker load命令将文件导入为一个镜像,会保存该镜像的的所有历史记录。比docker export命令导出的文件大,很好理解,因为会保存镜像的所有历史记录。


容器导入/导出:docker import/docker export;将一个容器导出为文件,再使用docker import命令将容器导入成为一个新的镜像,但是相比docker save命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。


删除容器


可以使用"docker rm 容器id"来删除一个终止状态的容器;若要删除一个运行中的容器,需要加-f参数。


最后,docker的强大功能远不止这些。这里只是从我自身使用的角度,用到了冰山一角。


比如安装其他资源如安装mysql,直接:


docker search mysql


拉取官方的镜像,标签为5.6


runoob@runoob:~/mysql$ docker pull mysql:5.6


等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为mysql,标签为5.6的镜像。


runoob@runoob:~/mysql$ docker images |grep mysql
mysql               5.6                 2c0964ec182a        3 weeks ago         329 MB


通过 Dockerfile构建


创建Dockerfile


首先,创建目录mysql,用于存放后面的相关东西。


runoob@runoob:~$ mkdir -p ~/mysql/data ~/mysql/logs ~/mysql/conf


data目录将映射为mysql容器配置的数据文件存放路径


logs目录将映射为mysql容器的日志目录


conf目录里的配置文件将映射为mysql容器的配置文件


进入创建的mysql目录,创建Dockerfile


Dockerfile


什么是dockerfile?


Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。


docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。


例:


docker build -f /path/to/a/Dockerfile


Dockerfile的基本结构


Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。


[root@docker docker_demo]# cat Dockerfile 
# base image
FROM centos
# MAINTAINER
MAINTAINER json_hc@163.com
# put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
ADD nginx-1.12.2.tar.gz /usr/local/src
# running required command
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel 
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx
# change dir to /usr/local/src/nginx-1.12.2
WORKDIR /usr/local/src/nginx-1.12.2
# execute command to compile nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio  --with-http_ssl_module  --with-http_realip_module    --with-http_addition_module    --with-http_xslt_module   --with-http_image_filter_module    --with-http_geoip_module  --with-http_sub_module  --with-http_dav_module --with-http_flv_module    --with-http_mp4_module --with-http_gunzip_module  --with-http_gzip_static_module  --with-http_auth_request_module  --with-http_random_index_module   --with-http_secure_link_module   --with-http_degradation_module   --with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80
ENTRYPOINT ["nginx"]
CMD ["-g","daemon on;"]


镜像导出和载入


导出

 

docker [image] save [option]


option参数:


-o 表示导出到哪个路径


例子:

 

// 导出centos 7 的镜像
docker save -o centos_7.tar centos:7


载入

 

docker [image] load [option]


option参数:


-i 导入的文件


例子:

 

docker load -i centos_7.tar


注意:导入的镜像及其相关的元数据信息(包括标签)


容器导入和导出


导出容器

 

docker [container] export [-o | --output[=""]] CONTABER


例子:

 

 // 导出一个容器
 docker export -o centos_for_run.tar centos


导入容器


docker import [-c | --change[ =[] ] ] [-m | --message[=MESSAGE]] file | URL | -[REPOSITORY[:TAG]]


参数:


-c, --change=[] 可以对导入的同时执行对容器进行修改的Dockerfile指令


例子:

 

docker import centos_for_run.tar - centos:7


注意:


docker load 和 docker import 命令很相似,load 命令用来导入镜像存储文件到本地镜像库,import命令用来导入一个容器的快照到本地镜像库。


两者的区别:容器快照文件将丢弃所有的历史记录和元数据信息(只保留了容器当时的快照状态),而镜像文件存储文件将保存完整记录

相关文章
|
1月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
95 2
|
2月前
|
Kubernetes Cloud Native 云计算
云原生入门:从Docker到Kubernetes的旅程
【10月更文挑战第2天】本文将带你走进云原生的世界,从基础的Docker容器技术开始,逐步深入到Kubernetes集群管理。我们将通过实际代码示例,探索如何利用这些工具构建、部署和管理现代云应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的知识和技能,让你在云原生领域迈出坚实的一步。
92 5
|
3天前
|
Ubuntu 应用服务中间件 nginx
docker入门-快速学会docker
本文介绍了Docker的基本概念,包括镜像、容器、tar文件、Dockerfile和仓库,并通过实际操作演示了如何使用Docker。从拉取Nginx镜像、运行容器、修改容器内容、保存容器为新镜像,到使用Dockerfile构建自定义镜像,最后讲解了如何保存和恢复镜像。文中还推荐了一个在线实践平台Play with Docker,方便读者快速上手Docker。
27 4
docker入门-快速学会docker
|
2月前
|
Linux 持续交付 Docker
掌握Docker:从入门到实践
Docker 是一个开源容器引擎,允许开发者将应用及其依赖打包成可移植的容器,在任意 Linux 机器上运行。本文从基本概念入手,详细介绍 Docker 的安装、基本操作、镜像构建及 Docker Compose 的使用,并通过实战案例展示如何部署 Web 应用、构建微服务架构及实现 CI/CD。通过学习,你将掌握 Docker 的核心功能,提升应用开发和部署效率。
|
28天前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
1月前
|
Cloud Native 持续交付 Docker
Docker容器化技术:从入门到实践
Docker容器化技术:从入门到实践
|
1月前
|
运维 持续交付 虚拟化
docker入门详解!!!
本文介绍了容器技术的发展历程,从物理机到虚拟化再到容器化,重点讲解了Docker的诞生及其优势。Docker通过轻量级的容器技术,实现了资源的高效利用、快速启动、环境一致性、持续交付和部署等优点。文章还详细解析了Docker的架构和工作原理,包括Docker Daemon、REST接口、Docker Client等组件,以及容器与虚拟机的差异。
79 2
|
1月前
|
Kubernetes Cloud Native 开发者
云原生技术入门:Kubernetes和Docker的协作之旅
【10月更文挑战第22天】在数字化转型的浪潮中,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,引领读者步入云原生的世界,着重介绍Kubernetes和Docker如何携手打造弹性、可扩展的云环境。我们将从基础概念入手,逐步深入到它们在实际场景中的应用,以及如何简化部署和管理过程。文章不仅为初学者提供入门指南,还为有一定基础的开发者提供实践参考,共同探索云原生技术的无限可能。
54 3
|
29天前
|
Kubernetes Linux Docker
容器化技术Docker入门与实践
容器化技术Docker入门与实践
52 0
|
2月前
|
Ubuntu Shell 开发者
Docker入门:轻松开始容器化之旅
【10月更文挑战第17天】Docker 是一种开源的应用容器引擎,它让开发者能够“一次构建、到处运行”。Docker 通过容器化技术将应用程序及其依赖打包在一起,从而确保应用在任何环境中都能一致地运行。本文将为新手用户提供一个全面的Docker入门指南,包括基本概念、优势、安装配置以及如何创建和管理容器。
54 2