Docker基本使用

本文详细介绍了Docker的基本概念、安装部署、镜像制作及容器端口映射。讲解了如何启动和停止Docker,从Docker Hub下载镜像,以及通过commit和build方式创建自定义镜像。此外,还涵盖了Docker镜像的保存与推送,以及容器的端口映射和访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Docker

一.Docker概述

1.1介绍

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙盒机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包装系统。

Docker是dotCloud公司开源的一个基于LXC的高级容器引擎,源代码托管在Github上, 基于go语言并遵从Apache2.0协议开源。

Docker让开发者可以打包他们的应用以及依赖包到一个可移植的container中,然后发布到任何流行的Linux机器上。

扩展:

LXC为Linux Container的简写。Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。

LXC主要通过来自kernel的namespace实现每个用户实例之间的相互隔离,通过cgroup实现对资源的配额和度量。

 

1.2.Docker 架构

工作流程:服务器A上运行docker Engine 服务,在docker Engine上启动很多容器container , 从外网Docker Hub上把image操作系统镜像下载来,放到container容器运行。这样一个容器的实例就运行起来了。

最后,通过Docker client 对docker 容器虚拟化平台进行控制。

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

如果拿虚拟机作一个比喻的话,Image就是关机状态下的磁盘文件,Container就是虚拟机运行时的磁盘文件,包括内存数据。

       

dockerhub:dockerhub是docker官方的镜像存储站点,其中提供了很多常用的镜像供用户下载,如ubuntu, centos等系统镜像。通过dockerhub用户也可以发布自己的docker镜像,为此用户需要注册一个账号,在网站上创建一个docker仓库。

1.3.Docker 核心技术

1.Namespace — 实现Container的进程、网络、消息、文件系统和主机名的隔离。

2.Cgroup — 实现对资源的配额和度量。

注:Cgroup的配额,可以指定实例使用的cpu个数,内存大小等。就像如下图,vmware虚拟机中的硬件配置参数。

1.4.Docker特性

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

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

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

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

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

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

 

优点:

1.一些优势和VM一样,但不是所有都一样。

比VM小,比VM快,Docker容器的尺寸减小相比整个虚拟机大大简化了分布到云和从云分发时间和开销。Docker启动一个容器实例时间很短,一两秒就可以启动一个实例。

2.对于在笔记本电脑,数据中心的虚拟机,以及任何的云上,运行相同的没有变化的应用程序,IT的发布速度更快。

Docker是一个开放的平台,构建,发布和运行分布式应用程序。

Docker使应用程序能够快速从组件组装和避免开发和生产环境之间的摩擦。

3.您可以在部署在公司局域网或云或虚拟机上使用它。

4.开发人员并不关心具体哪个Linux操作系统

使用Docker,开发人员可以根据所有依赖关系构建相应的软件,针对他们所选择的操作系统。

然后,在部署时一切是完全一样的,因为一切都在DockerImage的容器在其上运行。

开发人员负责并且能够确保所有的相关性得到满足。

5.Google,微软,亚马逊,IBM等都支持Docker。

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

缺点局限性:

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

一句话:docker只用于计算,存储交给别人。

oracle 不适合使用docker来运行,太大了,存储的数据太多。

二.部署安装Docker

2.1启动docker

[root@lewis63 ~]# yum -y install docker

[root@lewis63 ~]# systemctl start docker          #启动docker

[root@lewis63 ~]# docker version                        #查看docker版本

[root@lewis63 ~]# docker info                              #查看docker信息

Docker Root Dir: /var/lib/docker

......

Docker Root Dir: /var/lib/docker             #默认docker家目录

Debug Mode (client): false

Debug Mode (server): false

Registry: https://index.docker.io/v1/       #默认dockerhub的镜像源

Experimental: false

Insecure Registries:

 127.0.0.0/8

Registry Mirrors:

 https://bvxowo6f.mirror.aliyuncs.com

Live Restore Enabled: false

Registries: docker.io (secure)

2.2下载docker镜像

[root@lewis63 ~]# docker search centos           #从 Docker Hub 中搜索符合条件的镜像

OFFICIAL   是否官方提供

方法1:从公网docker hub 拉取(下载)image   pull:拉

[root@lewis63 ~]# docker pull docker.io/centos

方法2:使用阿里云docker镜像加速,提升pull的速度

登录容器Hub服务 https://cr.console.aliyun.com的控制台

[root@lewis63 ~]# vim /etc/docker/daemon.json

{

"registry-mirrors": ["https://bvxowo6f.mirror.aliyuncs.com"]

}

[root@lewis63 ~]# systemctl daemon-reload

[root@lewis63 ~]# systemctl restart docker

[root@lewis63 ~]# docker pull docker.io/centos

方法3:把之前下载好的image镜像导入image

docker.io-centos-lastest-image.tar  镜像上传到linux

参数:  -i " docker.io-centos-lastest-image.tar  " 指定载入的镜像归档。

[root@lewis63 ~]# docker load -i  /root/docker.io-centos-lastest-image.tar

查看images镜像列表

[root@lewis63 ~]# docker images      

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/centos    latest              1e1148e4cc2c        2 weeks ago         202 MB

注:

Docker镜像:rhel7.tar

KVM虚拟机镜像:rhel7.img        rhel7.qcow2

Vmware虚拟机镜像:centos7.vmdk

 

2.3开启动网络转发功能

[root@lewis63 ~]# vim /etc/sysctl.conf

加入:

net.ipv4.ip_forward = 1

[root@lewis63 ~]# sysctl –p

 

三.Docker基本使用

3.1运行docker实例

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

docker常用参数:

run  运行

-i   以交互模式运行容器,通常与 -t 同时使用;

-t  为容器重新分配一个伪输入终端,通常与 -i 同时使用

[root@lewis63 ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/centos    latest              1e1148e4cc2c        2 weeks ago         202 MB

[root@lewis63 ~]# docker run -it docker.io/centos:latest /bin/bash       #启动一个实例

[root@0a2f4cb43a5a /]# exit                #退出

2:在 container 中启动一个长久运行的进程,不断向stdin输出 hello world 。模拟一个后台运行的服务

docker常用参数:

-d  后台运行容器,并返回容器ID

-c  后面跟待完成的命令

[root@lewis63 ~]# docker run -d docker.io/centos:latest /bin/bash -c "while true;do echo hello world;sleep 1;done"

3503b40a64b02c2af56a142661bafd24438f2a5e8e02f7671a371d05c19d1142   #容器的ID

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

语法: docker  logs   容器实例的Name/ID

[root@lewis63 ~]# docker logs 3503b40a64b02       #容器的ID可以写全,也可以不写全,只要唯一就可以了

查看正在运行的容器

[root@lewis63 ~]# docker ps

[root@lewis63 ~]# docker ps -a  #-a 列出所有容器(包含沉睡/退出状态的容器);

3:杀死一个容器。 比如:杀死一个正在后台运行的容器

查看要杀死容器的ID

[root@lewis63 ~]# docker ps

[root@lewis63 ~]# docker kill 3503b40a64b0   #杀死一个容器

4:启动、停止、重启 删除container容器实例

[root@lewis63 ~]# docker run -d docker.io/centos:latest /bin/bash -c "while true;do echo hello world;sleep 1;done"

[root@lewis63 ~]# docker ps

CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS               NAMES

44a6faf58d0c        docker.io/centos:latest   "/bin/bash -c 'whi..."   13 seconds ago      Up 13 seconds                           pedantic_ardinghelli

停止:

[root@lewis63 ~]# docker stop 44a6faf58d0c

启动:

[root@lewis63 ~]# docker start 44a6faf58d0c

重启:

[root@lewis63 ~]# docker restart 44a6faf58d0c

删除:

[root@lewis63 ~]# docker rm 44a6faf58d0c

Error response from daemon: You cannot remove a running container 44a6faf58d0c840edcd7df7762d9cb2a4d2a02f68ad50779826cb3a829c1577c. Stop the container before attempting removal or use –f

无法删除正在启动的container容器实例,停止或加-f强制删除

[root@lewis63 ~]# docker rm -f 44a6faf58d0c

四.Docker镜像制作

Docker Image 的制作两种方法

方法1:docker commit   #保存 container 的当前状态到 image后,然后生成对应的image

方法2:docker build  #使用 Dockerfile 文件自动化制作 image

4.1 docker commit制作镜像

[root@lewis63 ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/centos    latest              1e1148e4cc2c        2 weeks ago         202 MB

[root@lewis63 ~]# docker run -it docker.io/centos:latest /bin/bash

[root@4dd805aabc2d /]# yum -y install httpd

[root@4dd805aabc2d /]# exit

查看 images 列表

[root@lewis63 ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/centos    latest              1e1148e4cc2c        2 weeks ago         202 MB

根据容器当前状态做一个image镜像:创建一个安装了apache工具的centos镜像

查看容易IDname

[root@lewis63 ~]# docker ps -a

CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS                        PORTS               NAMES

4dd805aabc2d        docker.io/centos:latest   "/bin/bash"              4 minutes ago       Exited (0) 2 minutes ago                          zen_wilson

[root@lewis63 ~]# docker commit 4dd805aabc2d docker.io/centos:apache         

或者

[root@lewis63 ~]# docker commit zen_wilson  docker.io/centos:apache2

[root@lewis63 ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE

docker.io/centos    apache2             5705927e7092        About a minute ago   305 MB

docker.io/centos    apache              abb8069ddd0c        3 minutes ago        305 MB

docker.io/centos    latest              1e1148e4cc2c        2 weeks ago          202 MB

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

[root@lewis63 ~]# docker run -it docker.io/centos:apache /bin/bash

[root@3a6b7316d903 /]# rpm -qa httpd

httpd-2.4.6-88.el7.centos.x86_64

说明基于apache镜像的容器创建成功

4.2 docker build创建一个centos的httpd web服务器镜像

使用docker build创建镜像时,需要使用 Dockerfile 文件自动化制作 image 镜像

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

以下操作在docker物理机上操作:

4.2.1创建工作目录

[root@lewis63 ~]# mkdir /docker-build

[root@lewis63 ~]# cd /docker-build/

4.2.2编辑Dockerfile文件

[root@lewis63 docker-build]# vim Dockerfile

FROM docker.io/centos:latest

MAINTAINER  <lk@163.cn>

RUN yum -y install httpd

ADD start.sh /usr/local/bin/start.sh

ADD index.html /var/www/html/index.html

CMD /usr/local/bin/start.sh

注释:

FROM  docker.io/centos:latest    # FROM 基于哪个镜像

MAINTAINER  <mk@xuegod.cn>  # MAINTAINER 镜像创建者

RUN yum -y install httpd       #RUN 安装软件用

ADD start.sh /usr/local/bin/start.sh  

ADD index.html /var/www/html/index.html

CMD /usr/local/bin/start.sh

# ADD  将文件<src>拷贝到新产生的镜像的文件系统对应的路径<dest>。所有拷贝到新镜像中的文件和文件夹权限为0755,uid和gid为0

CMD /usr/local/bin/start.sh    #container启动时执行的命令或启动服务,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD.

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

[root@lewis63 docker-build]# echo "/usr/sbin/httpd -DFOREGROUND" > start.sh

注:/usr/sbin/httpd -DFOREGROUND  参数的含意:

Systemd is designed to run processes "in the foreground", that is, they don't have to specifically run themselves as daemons.  The processes don't exactly run in the foreground, they run under systemd and it captures their input and output, but from the process's perspective, it is the same as running in the foreground.  That is systemd's preferred method of operation, but it does have compatibility with traditional daemons.

[root@lewis63 docker-build]# chmod a+x start.sh

创建 index.html

[root@lewis63 docker-build]# echo "docker image build test" > index.html

使用命令build来创建新的image

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

语法:docker build -t  父镜像名:镜像的tag   Dockerfile文件所在路径

-t :表示tage,镜像名

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

[root@lewis63 docker-build]# docker build -t docker.io/centos:httpd ./

注: ./ 表示当前目录。当前目录下要包含Dockerfile

…..

Complete!

 ---> bc41aa773675

Removing intermediate container d122e16c95ec

Step 4/6 : ADD start.sh /usr/local/bin/start.sh

 ---> f834935c54ca

Removing intermediate container 9bd0a1cd6fc5

Step 5/6 : ADD index.html /var/www/html/index.html

 ---> b32925453da8

Removing intermediate container 6acde42eca84

Step 6/6 : CMD /usr/local/bin/start.sh

 ---> Running in 600667d248cf

 ---> 88fd21276241

Removing intermediate container

[root@lewis63 docker-build]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/centos    httpd               88fd21276241        31 seconds ago      305 MB

docker.io/centos    apache2             5705927e7092        21 minutes ago      305 MB

docker.io/centos    apache              abb8069ddd0c        23 minutes ago      305 MB

docker.io/centos    latest              1e1148e4cc2c        2 weeks ago         202 MB

五.Docker image的发布

方法1:Save Image To TarBall

方法2:Push Image To Docker Hub

5.1Save Image To TarBall

保存 Image 到 tar 包

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

例:

[root@lewis63 ~]# docker save -o docker.io-centos-httpd-image.tar docker.io/centos:httpd

导入本地镜像

[root@lewis63 ~]# docker rmi docker.io/centos:httpd      #删除已存在的镜像

[root@lewis63 ~]# docker load -i docker.io-centos-httpd-image.tar

[root@lewis63 ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/centos    httpd               88fd21276241        6 minutes ago       305 MB

docker.io/centos    apache2             5705927e7092        27 minutes ago      305 MB

docker.io/centos    apache              abb8069ddd0c        29 minutes ago      305 MB

docker.io/centos    latest              1e1148e4cc2c        2 weeks ago         202 MB

5.2 Push Image To Docker Hub  发布到外网

1、Signup on docker hub & create repo    注册一个帐号

https://hub.docker.com/

2、Login to docker hub

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

3、Push image to docker hub   #上传镜像

# docker push centos:httpd

4、Pull image from docker hub   #下载镜像

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

 

 

方法3: 使用阿里云的私有仓库来发布

六.Container容器端口映射

6.1实战:Container 端口映射

注:因为要使用防火墙端口转发功能,所以必须开启防火墙

[root@lewis63 ~]# systemctl start firewalld ; systemctl enable firewalld

启动 container

[root@lewis63 ~]# docker run -d -p 80:80 docker.io/centos:httpd

5404561a3d3e1d056535dbd52e43646a30206ad73473925d4d899154c268fe2b

注: -p 物理机的80端口:容器实例的80端口  ,把容器中的80端口映射到物理机上的80端口

在物理机上查看容器状态

[root@lewis63 ~]# docker ps

CONTAINER ID        IMAGE                    COMMAND                  CREATED              STATUS              PORTS                NAMES

5404561a3d3e        docker.io/centos:httpd   "/bin/sh -c /usr/l..."   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp   priceless_torvalds

查看物理机上开启的80代理端口

[root@lewis63 ~]# netstat -anput | grep 80

tcp6       0      0 :::80                   :::*                    LISTEN      4036/docker-proxy-c

测试:

http://192.168.1.63/

6.2实战:访问正在运行的 container 容器实例

语法: docker exec -it <container id | name> /bin/bash

查看正在运行的容器ID:

[root@lewis63 ~]# docker ps

CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                NAMES

5404561a3d3e        docker.io/centos:httpd   "/bin/sh -c /usr/l..."   3 minutes ago       Up 3 minutes        0.0.0.0:80->80/tcp   priceless_torvalds

[root@lewis63 ~]# docker exec -it 5404561a3d3e /bin/bash          #进入容器

创建 test.html 文件

[root@5404561a3d3e /]# echo "hello world" > /var/www/html/test.html

测试:在物理机上查看新添加的test.html文件

[root@lewis63 ~]# curl http://192.168.1.63/test.html

hello world

6.3查看物理机和容器的网络

[root@lewis63 ~]# docker run -it docker.io/centos:httpd  /bin/bash

[root@d1f73f4d28db /]# yum -y install net-tools

[root@d1f73f4d28db /]# ifconfig

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 172.17.0.3  netmask 255.255.0.0  broadcast 0.0.0.0

注:相当于虚拟机的NAT网络模式

6.4配置容器root密码

[root@d65df994b0f3 /]# echo "root:123456" | passwd --stdin root

在容器中安装sshd服务,然后把22端口映射出去,就可以远程登录容器了。

[root@d65df994b0f3 /]# yum -y install openssh-server

[root@lewis63 ~]# docker run -d -p 222:222 docker.io/centos:httpd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值