docker基础&命令

前言

读者您好,以下为作者整理编写的文章,
若出现遗漏或书面错误,还请私聊告知一下。
该文章持续更新中, 喜欢的朋友可以收藏★

Docker产生的背景

开发交给运维war包
运维部署环境不兼容

docker的出现,解决了软件的运行环境和配置问题,方便做持续集成,并有助于整体的发布,是容器虚拟化技术。

docker一次编译,到处运行,可以在任何地方构建并运行。

软件可以带环境安装,安装的时候把原环境复制回来


目录


一、docker?

1.1 什么是docker

docker是一个开源的应用容器引擎,完全沙盒机制,不依赖于任何语言框架或操作系统。是dotCloud公司开源的一个基于LXC的高级容器引擎基于go语言开发的,并遵从Apache2.0协议开源,go语言是谷歌开发的。

容器是完全使用沙盒机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以徆容易地在机器和数据中心中运行。最
重要的是,他们不依赖于任何语言、框架戒包装系统。
*
沙盒就是隔离,英文sandbox,长用于计算机安全技术


扩展:

LXCLinux Container 的简写
Linux Container 容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。通过来自 kernelnamespace实现每个用户实例之间的相互隔离,通过cgroup实现对资源的配额和度量

每个容器互相隔离,进程不会相互影响。

docker 相对于 VM 虚拟机,少了虚拟机操作系统这一层,所以 docker 效率比虚拟机高。
在 docker 上启动一个实例 1-2 秒。


1.2 docker的图标

在这里插入图片描述


logo解析:
一条大鲸鱼上面有很多个集装箱
docker翻译为码头工人,就是搬运工的意思,鲸鱼就是负载很大,集装箱就是海上运货的一个创新,就是隔离独立互不影响的意思。

docker服务相当于鲸鱼
container容器就是集装箱


1.3 docker的特性

文件系统隔离
每个进程容器运行在一个完全独立的根文件系统里。

资源隔离:
系统资源,像 CPU 和内存等可以分配到不同的容器中,使用 cgroup。

网络隔离:
每个进程容器运行在自己的网络空间,虚拟接口和 IP 地址。

日志记彔:
Docker 将会收集和记彔每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。

变更管理:
容器文件系统的变更可以提交到新的镜像中,并可重复使用以创建更多的容器。无需使用模板或手劢配置。

交互式 shell:
Docker 可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互 shell。

采用容器化,对进程镜像隔离。可以把软件运行需要的所有资源打包到一个容器中。

官网:

https://www.docker.com

仓库:

https://www.hub.docker.com

源代码下载 :

https://github.com/docker/docker

1.4 docker的镜像

docker镜像为image

image可以理解为一个系统镜像, Container是image在运行时的一个状态

首先需要先从镜像仓库服务中拉取镜像。常见的镜像仓库服务Docker Hub,但是也存在其他镜像仓库服务。拉取操作会将镜像下载到本地 Docker 主机,可以使用该镜像启动一个或者多个容器。

镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包。

因为容器的设计初衷就是快速和小巧,所以镜像通常都比较小。


1.5 镜像的特点

1、一个分层存储的文件
2、一个软件的环境
3、一个镜像可以创建n个容器
4、一种标准化的交付
5、一个不包含linux内核而又精简的linux操作系统


二、 虚拟化技术

2.1 什么是虚拟化

虚拟化是资源的一种逻辑表示,并不会受限于物理资源。运行的环境不在真实的硬件上,而是硬件之上的虚拟内存中的一段,或者说是虚拟的环境中。虚拟化为数据、计算能力、存储资源等提供了一个逻辑视图,而不是物理视图。


2.2 虚拟化技术

虚拟化分为:
半虚拟化(kvm)、全虚拟化(xen)、硬件辅助虚拟化

例如:
docker容器技术Docker Engine和虚拟机技术Hypervisor,都是虚拟化技术。
一个是内核虚拟化,一个是硬件虚拟化


2.3 容器的优点

1.一些优势和 vmware 一样,但不是所有都一样。
比 vmware 小,快,因为简化了实例的大小,一两秒就可以启劢一个实例。

2.对于在硬件上的虚拟机,以及在任何的云上,运行相同的东西,发布速度更快。

3.Docker 是一个开源的平台,可以部署在公司局域网或云或虚拟机上。

4、能够避免开发和生产环境的问题。

5、开发人员不需要考虑底层的系统环境问题,可以根据所需的依赖关系构建相应的开发环境

6.Docker 支持多平台:
Unix/Linux 操作系统,也支持 Windows 或 Mac

7、很多大型企业都支持并使用该技术,例如:Google,微软,亚马逊,IBM 等。


2.4 缺点局限性

Docker 用于应用程序开发时是最有用的,但并不包含数据。日志,跟踪和数据库等通常都放在 Docker容器外。一个容器的镜像通常都很小,不适合存大量数据,存储可以通过外部挂载的方式使用。
比如使用:
NFS,ipsan,MFS 等,

简述:docker 用于计算,存储交给别人。
oracle 不适合使用 docker 来运行,太大,存储的数据多。


三、安装docker

3.1 docker安装条件

1、centos7.x及以上的版本,64位操作系统(指64位架构计算机系统)
2、centos仅发行版本中的内核支持docker
3、系统内核版本为3.10或更高版本

查看自己的内核

以centos为例:
cat /etc/centos-release
或
uname -r
或
dmesg | grep Linux

3.2 部署 docker 环境

首先要搭建yum仓库

安装包

yum install -y docker

服务管理

启动服务
systemctl start docker

停止服务
systemctl stop docker

服务开机自启动
systemctl enable docker

取消自启动
systemctl disable docker

查看docker版本

docker version
docker -v

查看docker的基本信息(系统信息、镜像和容器数等)

docker info

3.3 下载docker镜像

3.3.1 方法一 从dockerhub下载

DockerHub下载image(镜像)到本地

步骤一 从Docker Hub中搜索image

语法:docker search [OPTIONS]

--automated 只列出 automated build类型的镜像;
--no-trunc 显示完整的镜像描述;
-f <过滤条件> 列出收藏数不小于指定值的镜像。

[root@localhost ~]# docker search centos
INDEX       NAME                                        DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/centos                            The official build of CentOS.                   6936      [OK]       
docker.io   docker.io/ansible/centos7-ansible           Ansible on Centos7                              135                  [OK]
docker.io   docker.io/consol/centos-xfce-vnc            Centos container with "headless" VNC sessi...   132                  [OK]


参数说明:
Index:分类
NAME:镜像仓库源的名称
DESCRIPTION:镜像的描述
OFFICIAL:是否为docker官方发布
STARS:受欢迎程度
AUTOMATED:自动构建

如果 OFFICIAL 为[ok] ,说明是官方的,可以放心使用

步骤二 从docker hub 拉取(下载)

语法:docker pull NAME[:TAG]

例如:
docker pull docker.io/centos

3.3.2 TLS handshake timeout的报错

如果出现TLS handshake timeout的报错,是网络的问题,无法连接到docker hub。
解决方法:
可以使用华为云的镜像加速,提升pull的速度
在浏览器输入https://console.huaweicloud.com/swr/后,登录华为云账号后,选择下图的镜像加速器,弹出的页面有镜像加速的地址。
在这里插入图片描述在这里插入图片描述

也可以使用阿里云的 docker 镜像加速,提升 pull 的速度,在浏览器输入https://cr.console.aliyun.com 后,使用支付宝登录,左侧的加速器会显示为你分配的加速地址。
在这里插入图片描述
通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

vim /etc/docker/daemon.json 
修改前: 
{}

修改后:
{
"registry-mirrors": ["加速器地址"]
}

刷新一下配置文件
systemctl daemon-reload

重启一下服务
systemctl restart docker

重新下载就可以了
docker pull docker.io/centos


3.3.3 方法二 导入下载的镜像

把之前下载好的 image 镜像导入到image

docker load -i /root/docker.io-centos.tar 

-i指定载入的镜像位置并归档


3.3.4 方法三 下载其他站点的镜像

下载其他站点的镜像

docker pull hub.c.163.com/library/tomcat:latest

修改容器的默认下载地址,可以参考以下文档

https://www.cnblogs.com/bigberg/p/8057807.html

3.4 启动网络转发功能

默认是自动开启的。

如果没启动会出现以下报错:

WARNING: IPv4 forwarding is disabled. Networking will not work.

手动开启:

在/etcsysctl.conf 文件里插入以下内容
vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1



sysctl -p 	#从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载
显示
net.ipv4.ip_forward = 1


查看是否生效
cat /proc/sys/net/ipv4/ip_forward
显示
1	#已开启

四、docker的基本命令

可以通过以下命令来获取帮助

docker --help

4.1 查看images列表和container列表

4.1.1 列出本地image

语法:docker images查看所有镜像
-a 列出本地所有的镜像(含中间映像层,默认过滤掉中间映像层)
--digests 显示镜像的摘要信息
-f 显示满足条件的镜像
--format 指定返回值的模板文件
--no-trunc 显示完整的镜像信息
-q 只显示镜像ID

docker images #查看所有镜像
[root@localhost ~]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
docker.io/mattrayner/lamp   latest              c15726116aef        3 months ago        1.06 GB
docker.io/centos            latest              300e315adb2f        12 months ago       209.3 MB

各个参数的说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小

也可以根据镜像仓库名进行关键词查询
语法:dockers images [repository]

[root@localhost ~]# docker images docker.io/centos
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos    latest              300e315adb2f        12 months ago       209.3 MB

4.1.2 列出本地容器

语法:docker ps
-a 列出所有容器(包含沉睡/退出状态的容器)
-f 根据条件过滤显示的内容。
--format 指定返回值的模板文件。
-l 显示最近创建的容器。
-n 列出最近创建的n个容器。
--no-trunc 不截断输出。
-q 静默模式,只显示容器编号。
-s 显示总的文件大小。

[root@localhost ~]# docker ps	#查看运行中的容器
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
b4a2dd203351        300                 "/bin/bash"         About a minute ago   Up 15 seconds                           elegant_ride
[root@localhost ~]# docker ps -a	#列出所有容器
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                       PORTS               NAMES
b4a2dd203351        300                 "/bin/bash"         About a minute ago   Up 20 seconds                                    elegant_ride
84834e45a958        c1572611            "/run.sh"           About an hour ago    Exited (137) 7 minutes ago                       ecstatic_noether



各个参数的说明:
CONTAINER ID: 容器 ID
IMAGE: 使用的镜像
COMMAND: 启动容器时运行的命令
CREATED: 容器的创建时间
STATUS: 容器的状态
NAMES: 自动分配的容器名称
PORTS: 容器的端口信息和使用的连接类型(TCP/UDP)

状态有7种:
created(已创建)
restarting(重启中)
running(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)

4.1.3 查看镜像中各层内容及大小

语法:docker history [repository或image_id]
例如:

[root@localhost ~]# docker history centos
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
300e315adb2f        19 months ago       /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B                 
<missing>           19 months ago       /bin/sh -c #(nop)  LABEL org.label-schema.sch   0 B                 
<missing>           19 months ago       /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b71   209.3 MB        

4.2 选择image运行容器

语法:docker run [repository或image_id]
run 运行
-i 以交互模式运行容器,通常与 -t 同时使用;
-t 为容器重新分配一个伪输入终端
-d 后台运行容器,并返回容器 ID;
-c 后面跟待完成的命令
-p 物理机的端口:容器实例的端口,把容器中的端口映射到物理机的端口上
-P 随机端口映射,容器内部端口随机映射到主机的端口
/bin/bash放在镜像名后会有个交互式 Shell
-v --volume 主机目录:容器目录:权限(ro,rw), 绑定一个卷,例如 /data:/data,将主机的目录 /data 映射到容器的 /data。
--name 为容器指定一个名称;
-h 指定容器的hostname

例:运行一个 container 并加载镜像 centos,运行实例后,在实例中执行/bin/bash命令

docker run -it docker.io/centos /bin/bash
docker run -p 80:80 -v /data:/data -d nginx:latest

4.3 退出容器

exit

4.4 从容器中取出日志,查看输出的内容

语法: docker logs [Name或container _ID](容器的 ID 可以写全,也可以不写全,但要唯一)

docker logs name/id

例:在 container 中启动一个长久运行的进程,不断向 stdin 输出 hello,模拟后台运行的服务。并查看输出的内容。

docker run -d docker.io/centos:latest /bin/sh -c "while true;do echo hello; sleep 1; done"

导出日志
docker logs name/id

4.5 停止容器

语法: docker stop [Name或container _ID](容器的 ID 可以写全,也可以不写全,但要唯一)

docker stop [Name或container ID]

4.6 重启容器

语法:docker restart [Name或container _ID]

docker restart [Name或container ID]

4.7 启动容器

语法:docker start [Name或container _ID]

docker start [Name/container ID]

4.8 删除容器和镜像

4.8.1 删除指定的Container

语法:docker rm [Name或container _ID]

docker rm [Name或container_ID]

-f 强制删除
如果出现以下报错:

the container before attempting removal or use -f

先把容器关闭,然后再删除或者加-f 强制删除


4.8.2 删除镜像

语法:docker rmi image_Id

docker rmi image_Id

4.9 进入后台的容器

使用 -d 参数时,容器启动后会进入后台。此时要进入容器,可以通过以下指令进入:

4.9.1 使用docker attach进入,退出容器终端会停止容器

语法:docker attach container_id

docker attach container_id

4.9.2 使用docker exec进入,退出容器终端不会停止容器(建议用这个)

语法:docker exec container_id

docker exec -it id /bin/bash

4.9.3 小技巧:

忘记或者不懂时,可以加–help查看命令指示


4.10 显示一个正在运行中的容器进程信息

语法:docker top container_id


4.11 主机和容器之间传输文件

使用docker cp命令

docker cp /path/filename 容器id或名称:/path/filename

docker cp 容器id或名称:/path/filename /path/filename


五、docker 镜像的制作

Docker Image 的两种制作方法

1、docker commit 	保存container当前的状态到image后,生成对应的image
2、docker build		需要使用 Dockerfile 文件自动化制作image

5.1 方法 一

docker commit
先创建一个安装好 apache 工具的容器镜像

进入容器
docker run -it docker.io/centos:latest /bin/bash

在容器里安装 apache 软件包
yum -y install httpd

退出
exit

查看images列表
docker images

查看容器id
docker ps -a

语法:docker commit <container_ID>或<image_name> 新的镜像名:tag

生成镜像
docker commit container_id new_name:tag
例如:
docker commit b1c docker.io/centos:apache

使用新创建的镜像,生成一台容器实例
docker run -it docker.io/centos:apache /bin/bash

查看是否有httpd包
rpm -qa httpd

如果有,镜像创建成功

5.2 方法二

docker build
注:Dockerfile 有点像源码编译时./configure 后产生的 Makefile


5.2.1 创建目录和dockerfile文件

创建工作目录
mkdir /docker-build

进入目录
cd docker-build

创建镜像文件
touch dockerfile

5.2.2 编辑dockerfile

vim dockerfile
注: make 自劢化编译时需要 Makefile 文件,自劢化创建 docker 镜像时,需要 Dockerfil

文件内容:
FROM docker.io/centos:latest				# FROM 基于哪个镜像
MAINTAINER <wayne>							# MAINTAINER 镜像创建者
RUN yum install -y httpd					#RUN安装软件用的命令
ADD start.sh /usr/local/bin/start.sh		#ADD将文件<src>拷贝到新产生的镜像的文件系统对应的路径<dest>。所有拷贝到新镜像中的文件和文件夹权限为0755,uid和gid为0
ADD index.html /var/www/html/index.html
CMD echo hello world #container启劢时执行的命令戒启劢服务,但是一个 Dockerfile中只能有一条 CMD 命令,多条则只执行最后一条 CMD.

如:dockefile1 中的内容如下:
# vim dockefile1
FROM ubuntu
MAINTAINER xxx
RUN echo hello1 > test1.txt
RUN echo hello2 > /test2.txt
EXPOSE 80
EXPOSE 81
CMD ["/bin/bash"]

5.2.3 创建start.sh脚本启动httpd服务,默认首页index.html文件

在当前目录配置创建脚本
echo "/usr/sbin/httpd -DFOREGROUND" > start.sh
注:/usr/sbin/httpd -DFOREGROUND 相当于执行了 systemctl start httpd

配置文件的权限
chmod a+x start.sh

在当前目录创建index.html
echo "docker image build test" > index.html

5.2.4 使用命令 build 来创建新的 image

语法:docker build -t 父镜像名:镜像的tag Dockerfile所在的目录
-t 表示 tage,镜像名

例:使用命令 docker build 来创建新的 image,并命名为docker.io/centos:apache

docker build -t docker.io/centos:apache ./
注: ./ 表示当前目彔。另外你的当前目彔下要包含 Dockerfile

---

输出以下内容:
Sending build context to Docker daemon 4.096 kB
Step 1 : FROM docker.io/centos:apache
 ---> 32841c77ee1d
Step 2 : MAINTAINER <wayne>
 ---> Running in bf14d34c5c3b
 ---> ec83963862fc
Removing intermediate container bf14d34c5c3b
Step 3 : RUN yum install -y httpd
 ---> Running in fe051fe11fed
CentOS Linux 8 - AppStream                      330  B/s | 4.3 kB     00:13    
CentOS Linux 8 - BaseOS                         362  B/s | 3.9 kB     00:10    
CentOS Linux 8 - Extras                          98  B/s | 1.5 kB     00:15    
Package httpd-2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
 ---> 76c4e5460e51
Removing intermediate container fe051fe11fed
Step 4 : ADD start.sh /usr/local/bin/start.sh
 ---> fb02f26d0d2f
Removing intermediate container f668c879e7c4
Step 5 : ADD index.html /var/www/html/index.html
 ---> eac60ef4ec0c
Removing intermediate container b1f66abb4140
Step 6 : CMD echo hello word
 ---> Running in f9305acc3864
 ---> c0d852650423
Removing intermediate container f9305acc3864
Successfully built c0d852650423			#创建成功


查看images列表
docker images q
注意:docker镜像=应用/程序+库

六、镜像的发布

镜像的发布有两种方法

方法 1:Save Image To TarBall
方法 2:Push Image To Docker Hub

6.1 方法 一

保存 Image 成 tar 包

语法:docker save -o 导出的镜像名.tar 本地镜像名:镜像标签

保存镜像为tar的格式
docker save -o apache.tar docker.io/centos:httpd

查看保存的镜像
ll

例: 导入保存的镜像:
语法:docker load 保存的镜像路径
-i 指定导入的文件,代替 STDIN。
-q 精简输出信息

删除现有的
docker rmi docker.io/centos:httpd

查看镜像
docker images 	

导入刚才创建的镜像:
docker load -i apache.tar

查看
docker images

6.2 方法二

发布到外网的Docker Hub

6.2.1 注册一个docker hub帐号**

https://hub.docker.com/

6.2.2 登录到dockerhub**

docker login -u userabc -p abc123 -e userab@gmail.com

6.2.3 上传镜像到docker hub**

docker push centos:httpd

6.2.4从docker hub下载镜像**

docker pull userabc/centos:httpd #用户名/镜像名

6.3 方法三 使用华为云的的SWR容器镜像服务来发布


七、Docker 的文件地址

可以通过rpm命令进行查看

rpm -ql docker

配置文件的说明

/etc/docker/daemon.json			#配置加速地址
/var/lib/docker					#镜像、容器等内容,其下的containers文件夹为容器文件夹,image为镜像文件夹

八、Container端口映射

启动container并映射80端口
语法:docker run -p 物理机的端口:容器实例的端口
-p 指定物理机的端口:容器实例的端口
-P 随机生成(物理机的端口:容器实例的端口)

docker run -d -p 80:80 docker.io/centos:httpd /bin/bash -c /usr/local/bin/start.sh

查看容器映射的端口
docker ps

注意:
物理机的端口只能映射到容器内的某一个端口上,如:8080:80之后,就不能8080:81
容器内的端口可以被物理机的多个端口映射,如:8080:80,8081:80,8082:80

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值