技能篇:docker的简易教程

虚拟机技术每家公司发展到一定规模都必须考虑的,更好的环境隔离,更好的事故排查,更好的服务部署

  • docker的原理
  • docker更换阿里源
  • docker容器的相关命令
  • Dockerfile文件编写
  • docker镜像的相关命令

关注公众号,一起交流,微信搜一搜: 潜行前行

1 docker的原理

  • Docker 利用Linux 中的核心分离机制,例如Cgroups,以及Linux的核心Namespace(名字空间)来创建独立的容器。一句话概括起来Docker就是利用Namespace做资源隔离,用Cgroup做资源限制,利用Union FS做容器文件系统的轻量级虚拟化技术。Docker容器的本质还是一个直接运行在宿主机上面的特殊进程,看到的文件系统是隔离后的,但是操作系统内核是共享宿主机OS,所以说Docker是轻量级的虚拟化技术

docker 镜像分层

  • docker 容器,理解为一个或多个运行进程,而这些运行进程将占有相应的内存,相应的CPU计算资源,相应的虚拟网络设备以及相应的文件系统资源。而 docker 镜像,则像一个未运行的软件包,为 docker 容器的运行提供文件资源。
  • docker 镜像是分层的。启动镜像时,一个新的可写层会加载到镜像的顶层。这一层通常称为”容器层”,之下是”镜像层”,可能存在多个层。容器层可以读写,容器所有发生文件变更写都发生在这一层。镜像层只允许读取,read-only
  • 在容器层的文件增删操作,命令安装,都会被记录下来。我们可以通过 commit 命令来创建一个新的镜像
    技能篇:docker的简易教程

2 docker 更换阿里源

vi /etc/apt/sources.list
~~更新源
sudo apt-get clean
sudo apt-get update
~~ 安装vim
apt-get install vim
  • ubuntu 18 的阿里镜像文件。使用下面的数据替换原 sources.list 里的数据
deb http://mirrors.aliyun.com/ubuntu/ trusty main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main multiverse restricted universe

3 docker容器的相关命令

run 实例化容器

  • 创建一个新的容器并运行: docker run [options] image [command]。image 可以是镜像ID 也可以是仓库名+Tag名:repository[:tag]
options 常用参数
-i              以交互模式运行容器,通常与 -t 同时使用
-t              为容器重新分配一个伪输入终端,通常与 -i 同时使用
-d              后台运行容器,并返回容器ID
--name=   为容器指定一个名称
-p              指定端口映射,格式为:主机(宿主)端口:容器端口
--net="bridge"  指定容器的网络连接类型,支持bridge/host/none/container: 四种类型
-e ="v"         设置环境变量
  • 示例
[root@lwl]# docker run -it -p 80:80 --name mynginx nginx:latest /bin/bash
root@b8573233d675:/#

~~ 如果容器的启动命令是依赖伪终端执行,则需要 -it,如 ubuntu:14.04 镜像
~~ 没有依赖伪终端执行的启动命令,可去掉-it,因为-d 参数会直接返回容器ID
[root@lwl]# docker run -it -d -p 80:80 --name mynginx nginx:latest
315cc38afc2f06abb5a2fbb075ebca16455367b2de685cf0c5ba828ab62dd5a1
[root@lwl]#

start、stop、restart 启动与停止

~~ 启动已被停止的容器 。 container 可以是容器名 也可以是容器ID
docker start container
~~ 停止运行中的容器
docker stop container
~~ 重启容器
docker restart container

ps 容器查询

// 列出容器
docker ps [-options]

-a :显示所有的容器,包括未运行的。
-f :根据条件过滤显示的内容。
--format :指定返回值的模板文件。
-l :显示最近创建的容器。
-n :列出最近创建的n个容器。
--no-trunc :不截断输出。
-q :静默模式,只显示容器编号。
-s :显示总的文件大小

// 相当于在 container 容器里使用 top命令
docker top container

rm 删除容器

docker rm container

cp 文件传输

  • 本机和 docker 容器之前的文件传输
~~ 复制本地目录 srcPath 到 容器 container 的目录 destPath
docker cp srcPath container:destPath
~~ 复制容器 container 的目录 srcPath 到本地目录 destPath
docker cp container:destPath srcPath

exec 在运行的容器中执行命令

docker exec [options] container command

-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端

~~ 在容器 mynginx 中以交互模式执行容器内 /root/run.sh 脚本
docker exec -it mynginx /bin/sh /root/run.sh
~~ 在容器 mynginx 中开启一个交互模式的终端
docker exec -it mynginx /bin/bash

logs 获取容器的日志

docker logs [options] container

-f      跟踪日志输出
--since 显示某个开始时间的所有日志
-t      显示时间戳
--tail  仅列出最新N条容器日志

[root@lwl]# docker logs -f mynginx
192.168.239.1 - - [10/Jul/2021:16:53:33 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36" "-"
2021/07/10 16:53:33 [error] 5#5: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 192.168.239.1, server: localhost, request: "GET /favicon.ico HTT
....

4 Dockerfile文件编写

docker build -f /path/to/a/Dockerfile
// 1 FROM:指定基础镜像,必须为第一个命令,格式:
FROM
FROM :
// 2 MAINTAINER: 维护者信息 格式:
MAINTAINER
// 3 ENV:设置环境变量 格式
// 4 ARG:用于指定传递给构建运行时的变量 格式:
ARG [=]
// 5 WORKDIR:工作目录,类似于cd命令 格式:
WORKDIR /path/to/workdir
ENV =...

// 7 COPY:功能类似ADD,但是是不会自动解压文件
// 8 RUN:构建镜像时执行的命令 格式
RUN
// 9 CMD:构建容器后调用,也就是在容器启动时才进行调用
CMD command param1 param2 (执行shell内部命令)
// 10 ENTRYPOINT:配置容器,使其可执行化
ENTRYPOINT command param1 param2 (shell内部命令)
  • Dockerfile 示例
基础镜像
FROM centos
维护者信息
MAINTAINER tianfeiyu
#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#ADD  文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/

RUN 执行以下命令
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www

WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0

RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
RUN echo "daemon off;" >> /etc/nginx.conf

CMD 运行以下命令
CMD ["nginx"]

5 docker 镜像的相关命令

  • 镜像查看列举: docker images
  • 镜像搜索: docker search <imagename></imagename>;imageName 是 repository[:tag] 的模糊词
  • 拉取: docker pull repository[:tag]
  • 删除单个镜像: docker rmi &#x955C;&#x50CF;ID 或者 docker rmi repository[:tag]
  • 给镜像打别名(标签): docker tag oldRepository[/:oleTag] newRepository][/:newTag]
docker tag ubuntu:15.10 lwl/ubuntu:v3
  • 构建镜像
~~ 根据 Dockerfile 构建镜像
docker build -t repository[:tag] dir
docker build -t lwl/ubuntu:v1 .

options 参数
--build-arg=[]   设置镜像创建时的变量
-t               镜像的名字及标签,通常 name:tag 或者 name 格式
-f               指定要使用的Dockerfile路径
~~ 根据正在运行的 container 容器 构建镜像
docker commit [options] container repository[:tag]

options 参数
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停
  • 推送: docker push repository[:tag]

欢迎指正文中错误

参考文章

Original: https://www.cnblogs.com/cscw/p/15029679.html
Author: 潜行前行
Title: 技能篇:docker的简易教程

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/571984/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • java并发和排序的简单例子(Runnable+TreeSet)

    很多时候并发需要考虑线程安全,但也有很多时候和线程安全毛关系都没有,因为并发最大的作用是并行,线程安全仅仅是并发的一个子话题。 例如常常会用于并发运算,并发i/o。 下文是一个练习…

    Java 2023年6月9日
    084
  • SpringBoot进阶教程(七十一)详解Prometheus+Grafana

    随着容器技术的迅速发展,Kubernetes已然成为大家追捧的容器集群管理系统。Prometheus作为生态圈Cloud Native Computing Foundation(简…

    Java 2023年6月8日
    0184
  • java连接mysql8.0.28数据库实例

    首先说明,由于是8版本的数据库,所以配置类的写法上与5版本的有所区别,需要注意,同时用idea或eclipse时需要导入jar包,jar包的下载链接: https://dev.my…

    Java 2023年6月9日
    088
  • UML 活动图

    本学期在学 uml 建模,这星期要完成对项目用例图中几个主要用例的活动图分析,索性写下自己对活动图的学习笔记和实操。有些类似的用例,网上或者书上的活动图表示都不尽相同,我是按照自己…

    Java 2023年6月5日
    064
  • SpringCloud简介

    Spring Cloud是一个相对比较新的微服务框架,2016n年推出1.0的release版本. 虽然Spring Cloud时间最短, 但是相比Dubbo等RPC框架, Spr…

    Java 2023年5月30日
    086
  • day04-1群聊功能

    多用户即时通讯系统04 4.编码实现03 4.5功能实现-群聊功能实现 4.5.1思路分析 群聊的实现思路和私聊的实现非常类似。 不同的是:私聊时,服务端接收到消息后,只需要找出接…

    Java 2023年6月15日
    081
  • JAVA复习总体大纲

    1 java基础. [1].变量— 数据类型 变量名=值;数据类型:1.基本数据类型. byte[1字节] short[2字节] int[4字节] long[8字节] …

    Java 2023年6月5日
    070
  • Eureka使用总结

    关于Eureka: 提供基于 REST的服务,在集群中主要用于服务管理。使用该框架,可以将业务组件注册到Eureka容器中,这些组件可进行集群部署,Eureka主要维护这些服务的列…

    Java 2023年6月13日
    072
  • mybatis总结

    第一步 第二步 <build>        <resources>       &#…

    Java 2023年6月7日
    070
  • SpringMVC(5)-ssm整合实现增删改查-mybatis层

    mybatis层编写完毕后的项目目录 1.右键SpringMVC2项目-》new-》Modual-》选择maven项目(我的项目名为Study09_ssm),输入模块名,点击Fin…

    Java 2023年6月9日
    071
  • 迷途的野指针,都快找不着北了

    指针,C语言开发者表示很淦,指针的使用,很多人表示不敢直面ta,不像Java一样,有垃圾自动回收功能,我们不用担心那么多内存泄漏等问题,那C语言里边呢,指针又分为了”野…

    Java 2023年6月5日
    089
  • 使用Intellij IDEA搭建Ext JsMVC web项目

    由于自己从android开发转来学习web开发,最近在学习Jsp,之前接触过一点Extjs,所以用jsp来配合ext试试。 Ext JS介绍 extjs是一个javascript框…

    Java 2023年6月13日
    060
  • IDEA 如何根据一个关键字检索项目中的所有代码呢?

    今天笔者接到一个需求,项目中提示 “****”错误信息,那么如何处理呢? 由于笔者第一次接触这个项目,所以只能进行全文检索获取相应的信息,那么如何全文检索呢…

    Java 2023年6月15日
    081
  • idea激活码

    转载请注明出处。 作者:peachyy 出处:http://www.cnblogs.com/peachyy/ 出处:https://peachyy.gitee.io/ 出处:htt…

    Java 2023年6月16日
    081
  • abp MicroserviceDemo swagger添加 OAuth

    abp官方示例中的 abp-samples,swagger并没有提供 OAuth,这个在我们平时的开发过程中并不太友好,这里记录下在添加 swagger OAuth遇到的一些问题,…

    Java 2023年6月8日
    0126
  • 140_SpringBoot案例-fanout发布订阅模式

    整体核心 目标 实现步骤 生产者 创建生产者工程:springboot-rabbitmq-fanout-producer 在pom.xml中引入依赖 在application.ym…

    Java 2023年6月7日
    0104
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球