docker基础使用与入门实践

一、何为docker

docker最早基于LXC实现(LinuX Container)从0.7版本以后开始去除LXC转而使用自行开发的libcontainer,从1.11开始,演进为runC和containerd;docker是go语言开发,基于Linux内核的cgroup,namespace以及AUFS类似的Union FS(联合文件系统)等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术,由于隔离的进程独立于宿主机和其他的隔离进程,因此也称其为容器。
docker在容器的基础上进行了进一步的封装从文件系统,网络互联到进程隔离等,极大简化了容器的创建和维护管理。使得docker技术比虚拟机技术更为轻便,快捷。

虚拟机与docker比较:
图片引用自网络

由上面的比较图可以看同样启动一个服务;虚拟机会多一层操作系统,而docker和宿主机共用内核系统;因此docker占用资源更少,资源利用率更高;
虚拟机与docker对比

docker优点总结:
高效的资源利用率
快速的启动
一致的运行环境
持续将会和部署
更轻松的迁移
便捷的维护和扩展

二、dcoker安装

系统要求:CentOS7.x_x64且安装Docker CE版本(社区版),不要使用epel仓库自带的docker docker从1.17后主要分docker-ce和docker-ee(企业版,你懂滴,就好比mysql企业版与社区版,如果还不明白当我没说)

以下安装基于CentOS 7.4_x64 最小化安装

[[email protected] ~]# uname -r
3.10.0-693.21.1.el7.x86_64
[[email protected] ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core) 

#御载自带组件
yum remove docker docker-client docker-client-latest  docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux  docker-engine -y
#添加国内源
 yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo

#安装依赖组件
[[email protected] ~]# yum install -y yum-utils device-mapper-persistent-data  lvm2

#添加官方源
[[email protected] ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

#最新版的docker CE 使用以下命令
[[email protected] ~]# yum-config-manager --enable docker-ce-edge

#测试版docker ce 使用以下命令 (可选)
 [[email protected] ~]# yum-config-manager --enable docker-ce-test

#安装docker ce
 [[email protected] ~]# yum makecache fast
 [[email protected] ~]# yum install install docker-ce
 #注意官方docker-ce可能有点慢~

#或使用脚本自动安装
 [[email protected] ~] # curl -fsSL get.docker.com -o get-docker.sh
 [[email protected] ~]# sh get-docker.sh --mirror Aliyun

#安装完查看版本信息
[[email protected] ~]# docker --version
Docker version 18.04.0-ce, build 3d479c0

#启动docker
[[email protected] ~]# systemctl start docker

以上表示安装成功docker-ce版本,以下的示例测试均在此基础上进行;如果是ubuntu安装docker请参考这里ubuntu安装docker-ce

三、docker组件

从物理上讲client <--> docker daemon <--> Registry Server
逻辑上:
Images:
镜像只读,分层镜像机制,最后一层可读写,可共享,或理解为OS
Containers:容器:
是从镜像启动创建的,类似程序与进程的关系,而Images镜像就是程序文件,运行起来成为进程;镜像是静态定义,容器是镜像运行时的实体;容器可以被创建,启动,停止,删除,暂停;容器实质是进程;

Registry:Image Repositories (存放共享的镜像库,类似yum库)docker官方提供仓库地址hub.docker.com

容器的状态与指令:
常用状态如:
created:docker create(不常用),docker run 指令从镜像创建并运行
running:docker run 指令从镜像创建并运行
paused:docker paused 暂停容器
stopped:docker stop 停止运行某容器,或通过docker kill容器
状态间转化如图:

以上指令均可通过docker --help 或docker COMMAND --help获取子命令帮助

查看docker相关信息:

docker --version
Docker version 18.03.0-ce, build 0520e24

获取docker daemon运行的信息
docker info

镜像相关操作
列出本机镜像:
docker images
拉取下载镜像:
docker pull 库/镜像名:版本 默认是docker.io/镜像名:lastest
删除镜像:
删除关确保没有容器使用
docker rmi 镜像名|镜像ID
查找镜像:
docker search 镜像名

[[email protected] ~]# docker search busybox
NAME                        DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
busybox                     Busybox base image.                             1239                [OK]
progrium/busybox                                                            66                                      [OK]

说明:STARS可理解为获取的赞,OFFICIAL OK表示官方出的

示例:拉取busybox

[[email protected] ~]# docker pull busybox
Using default tag: latest

注意:没有指定仓库,默认从docker.io上获取最新latest版本

容器相关常用操作
docker run 选项 镜像:创建并运行一个容器
选项如下:
--rm 运行容器停止退出后删除容器
--it 交互式运行容器
-d 后台daemon运行(和--rm不可同时出现)
--name 指定容器名
-p [port:port] 把容器中的端口映射出来

docker ps :查看运行中的容器
docker ps -a:查看所有的容器(包括停止状态)
docker start :启动处于停止状态的容器
docker inspect 容器:查运行中容器信息
docker network ps :查看docker 网络接口
docker attach:附加至某运行状态的容器的终端设备;(运行在后台中的容)
docker exec:让运行中的容器运行一个额外的程序(容器中有程序前台占终端运行情况下,后面有实例)
docker logs:输出容器内部程序运行时输出到终端的信息
docker stats:动态方式显示容器的资源占用状态
docker top:显示容器运行的进程
docker kill :停止容器(容器牌前台运行时)
docker stop:停止容器
docker tag 镜像 新镜像:标记镜像
docker login -u 用户名: 登录(默认docker.io需要注册)用户名
docker pull 镜像:默认从docker.io仓库获取最新版本镜像,如是私有仓库需要登录
docker push 镜像:登录后可push(默认docker.io)仓库
docker rename:重命名容器
docker restart: 重启容器
docker pause:暂停容器
docker unpause:从暂停状态恢复
docker rm :删除容器,需要注意的是容器只能是关闭状态才能删除
或运行进docker run --rm 表示运行停止后就删除容器

示例:从busybox镜像启动容器b1 前台运行

[[email protected] ~]# docker run --rm -it --name b1 busybox
#
按crtl + p +q  从终端拆除(转入后台)
#查看容器
[[email protected] ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
356979c81de8        busybox             "sh"                About a minute ago   Up About a minute                       b1

说明:可以看到运行状态是up  容器名指定为b1 可以通过docker stop b1 停止 (由于 --rm选项)即容器删除
[[email protected] ~]# docker stop b1
b1
[[email protected] ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[[email protected] ~]#

示例:后台启动容器 b1

[[email protected] ~]# docker run -d -it --name b1 busybox
b8548d53a69999b0c351dc779ebf18cdcfd40dc4d749bc7a6cec300d3ad958e5
[[email protected] ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
b8548d53a699        busybox             "sh"                17 seconds ago      Up 16 seconds                           b1
[[email protected] ~]# docker stop b1
b1
[[email protected] ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
b8548d53a699        busybox             "sh"                49 seconds ago      Exited (137) 14 seconds ago                       b1

说明:通过后台启动模式,在停止运行后 容器处于退出停止状态,并不会删除,下次可以通过 docker start b1再次启动,--rm和-d不能同时存在。

四、镜像制作

镜像制作有两种方式,基于容器制作和基于(已有)镜像制作;
基于(运行中)容器制作
在容器中完成操作后制作
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]
示例:基于busybox 镜像启动容器b1并在容器里启动httpd服务 并以此运行的容器制作镜像

运行容器(进入容器操作)
[[email protected] ~]# docker run -it --name b1 busybox
/ # mkdir -pv /data/html
created directory: ‘/data/‘
created directory: ‘/data/html‘
/ # echo "<h1> Busybox httpd server</h1>" >/data/html/index.html
/ # cat /data/html/index.html
<h1> Busybox httpd server</h1>
/ # httpd -h /data/html
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
                        ....省略....
/ # netstat -ntpul
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 :::80                   :::*                    LISTEN      8/httpd

按ctrl +p +q 进入后台(拆除终端)
[[email protected] ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
477cf5b3abca        busybox             "sh"                4 minutes ago       Up 4 minutes                            b1

从以上可以看出在b1容器中启动了http 并侦听在80端口上;拆除终端进入了后台运行;

基于运行中的b1容器制作镜像并打上新的标签名"docker.io/dyc2005/bbox:v0.1.1-httpd"

[[email protected] ~]# docker commit -p -a "san <[email protected]>"  b1 docker.io/dyc2005/bbox:v0.1.1-httpd
sha256:c4e8c59c4b577a568002789e7c266828a8e86dd9fdd825b05f91933a5e9710f0
[[email protected] ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
dyc2005/bbox        v0.1.1-httpd        c4e8c59c4b57        6 seconds ago       1.15MB
busybox             latest              8ac48589692a        9 days ago          1.15MB

此时新的镜像ID和busybox(产生b1容器)镜像ID已经 不同了,此时也可通过
docker push 推到镜像库中
验证:
基于新的镜像后台启动容器b2
补充:与上面效果类似
[[email protected] ~]# docker commit -a "san" -c ‘CMD ["/bindocke/httpd","-f","-h","/data/html"]‘ b1 docker.io/dyc2005/bbox:v0.1.2-httpd
#运行制作好的镜像:
[[email protected] ~]# docker run --name h2 -it dyc2005/bbox:v0.1.2-httpd
[[email protected] ~]# docker exec h2 ps
PID USER TIME COMMAND
1 root 0:00 /bin/httpd -f -h /data/html
8 root 0:00 ps
[[email protected] ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7147cb559d9 dyc2005/bbox:v0.1.3-httpd "/bin/httpd -f -h /d…" 22 seconds ago Up 21 seconds h2

[[email protected] ~]# docker run -it -d  --name b2 docker.io/dyc2005/bbox:v0.1.1-httpd httpd -f -h /data/html
b93754954d61b1a477ef361fcb348962b9b10004221263d9f4c69db193730a61
#查看b2的信息查看ip
[[email protected] ~]# docker inspect b2 |grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAddress": "172.17.0.3",
#访问b2
[[email protected] ~]# curl http://172.17.0.3
<h1> Busybox httpd server</h1>

至此基于运行中的容器制作镜像完成!
此时产生一个问题,运行中的镜像进入是docker attach b2
但你发现终端卡在那里,由于httpd(容器中)前台运行,无法修改网页
解决方法:

[[email protected] ~]# docker exec -it b2 /bin/sh
/ # netstat -ntpul
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 :::80                   :::*                    LISTEN      1/httpd
/ # 

通过 docker exec 就可以进行运行在容器前端的中修改容器中的内容!这也是attach与exec命令的区别所在!
另外本次运行镜像端口没有做映射,后面会提到!一般不推荐如此制作镜像;制作镜像推荐使用Dockerfile文件

基于镜像制作
编辑 Dockerfile,而后根据此文件制作;
详细说明参照这里
以下给出实例:
宿主机上创建bbox
[[email protected] ~]# mkdir -pv bbox/data
[[email protected] ~]# cat /data/html/index.html
&lt;h1&gt;Busybox httpd server from Dockerfile.&lt;/h1&gt;
[[email protected] ~]#cat Dockerfiel

FROM busybox:latest
MAINTAINER "san" "<[email protected]>"
#COPY index.html /data/html/
COPY data /data/
VOLUME /data/html
EXPOSE 80/tcp
ENV epel_repo_file http://172.16.0.188/epel.repo
ADD ${epel_repo_file} /etc/yum.repos.d/
RUN /bin/adduser -D myuser &&     /bin/mkdir /tmp/dir -pv

注意请自行模拟一个可访问的http能访问到的epel.repo
在bbox目录中运行

[[email protected] bbox]# docker build -t docker.io/dyc2005/busybox/v.1.1-httpd ./
Sending build context to Docker daemon  4.096kB
Step 1/8 : FROM busybox:latest
 ---> 8ac48589692a
Step 2/8 : MAINTAINER "san" "<[email protected]>"
 ---> Using cache
 ---> 3105f31095b2
Step 3/8 : COPY data /data/
 ---> Using cache
 ---> 355f7a29fd45
Step 4/8 : VOLUME /data/html
 ---> Using cache
 ---> 4111c015d683
Step 5/8 : EXPOSE 80/tcp
 ---> Using cache
 ---> 6f2ef2457118
Step 6/8 : ENV epel_repo_file http://172.16.0.188/epel.repo
 ---> Using cache
 ---> d1ac10e625c4
Step 7/8 : ADD ${epel_repo_file} /etc/yum.repos.d/
Downloading [==================================================>]      10B/10B
 ---> 943a7f280b6e
Step 8/8 : RUN /bin/adduser -D myuser &&     /bin/mkdir /tmp/dir -pv
 ---> Running in 15bb73b0690d
created directory: ‘/tmp/dir‘
Removing intermediate container 15bb73b0690d
 ---> e2ff30f1beb2
Successfully built e2ff30f1beb2
Successfully tagged dyc2005/busybox/v.1.1-httpd:latest

##查看新生成的镜像并运行
[[email protected] bbox]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
dyc2005/busybox/v.1.1-httpd   latest              e2ff30f1beb2        52 seconds ago      1.15MB
[[email protected] bbox]# docker run -it --rm --name d1 dyc2005/busybox/v.1.1-httpd
/ # id myuser
uid=1000(myuser) gid=1000(myuser) groups=1000(myuser)
/ # ls /tmp/dir/
/ # ls /tmp/
dir
/ #
可以看出新生成的镜像已经完成了指定的操作

到此镜像制作的两咱方法已经小试牛刀的演示完,推荐用dockerfile文件生成镜像,Dockerfile中的每一行的命令都是一层
因此建议使用command && command && ...这种方式;

五、镜像的导入与导出以及使用Volume(外部的目录)

将镜像文件导出为tar文件
docker save #镜像保存成文件(在没有仓库的情况下)
Save one or more images to a tar archive (streamed to STDOUT by default)
docker save [OPTIONS] IMAGE [IMAGE...]
示例:docker save -o /root/nginx-v0.1.0.tar 4481eeccc973

从tar文件导入镜像

docker load ##从文件导入成镜像
Load an image from a tar archive or STDIN
docker load [OPTIONS]
    --input, -i     Read from tar archive file, instead of STDIN
    --quiet, -q false   Suppress the load output
    示例
# docker load -i nginx-v0.1.0.tar

重新打标签
[[email protected] ~]# docker tag 4481eeccc973 docker.io/dyc2005/nginx.v0.1.0

Bind mount volume :容器内和宿主机上都是用户指定
[[email protected] ~]# run -it --name bbox1 -v /data/html  busybox:v1.0
[[email protected] ~]# cat /var/lib/docker/volumes/163a16717cb1d859869cdd7a87a3ad91b04e754ff26130d9145fe0c4ccf94e05/_data# cat index.html
            <h1>c1</h1>
[[email protected] ~]#docker inspect -f {{.Config.Volume}}{{.Mounts}} bbox1
Docker-managed volume :容器内用户指定,宿主机上的目录默认在/var/lib/docker/volumes 由docker指定
[[email protected] ~]#docker run -it -v HOSTDIR:VOLUME --name bbox2  busybox:v1.0
[[email protected] ~]# mkdir -pv /tmp/data(宿主机上)
[[email protected] ~]# echo "<h1> Test Page in App1</h1>" >/tmp/data/index.html
[[email protected] ~]# docker run --name h2 -d -it  -v /tmp/data:/data/html dyc2005/bbox:v0.1.3-httpd
[[email protected] ~]# curl http://172.17.0.2
        <h1> Test Page in App1</h1>
[[email protected] ~]# docker inspect -f {{.Mounts}} bbox2

列出volume卷:

[[email protected] ~]#docker inspect -f {{.Mounts}} bbox2
docker volume list
DRIVER VOLUME NAME
local 163a16717cb1d859869cdd7a87a3ad91b04e754ff26130d9145fe0c4ccf94e05

查看详细信息

[[email protected] ~]#docker inspect -f {{.Mounts}} bbox2
docker volume inspect
163a16717cb1d859869cdd7a87a3ad91b04e754ff26130d9145fe0c4ccf94e05
    [
        {
            "CreatedAt": "2018-04-09T18:10:46+08:00",
            "Driver": "local",
            "Labels": null,
            "Mountpoint": "/var/lib/docker/volumes/163a16717cb1d859869cdd7a87a3ad91b04e754ff26130d9145fe0c4ccf94e05/_data",
            "Name": "163a16717cb1d859869cdd7a87a3ad91b04e754ff26130d9145fe0c4ccf94e05",
            "Options": {},
            "Scope": "local"
        }
    ]
    或
[[email protected] ~]#  inspect -f {{.Mounts}} bbox2
    [{volume 163a16717cb1d859869cdd7a87a3ad91b04e754ff26130d9145fe0c4ccf94e05 /var/lib/docker/volumes/163a16717cb1d859869cdd7a87a3ad91b04e754ff26130d9145fe0c4ccf94e05/_data /data/html local  true }]

注意问题:挂载volume到容器,如果容器中有内容则复制到宿主机目录,一般删除容器不会删除volume,如果要一并删除需要加--volumw|-v选项
单独删除 docker volume rm 命令

多个容器使用同一个宿主目录

[[email protected] ~]# docker run --name h1 -d -it  -v /tmp/data:/data/html dyc2005/bbox:v0.1.3-httpd
[[email protected] ~]# docker run --name h2 -d -it  -v /tmp/data:/data/html dyc2005/bbox:v0.1.3-httpd
或复制其他主机使用的volume
[[email protected] ~]# docker run --name h1 -d -it  -v /tmp/data:/data/html dyc2005/bbox:v0.1.3-httpd

 [[email protected] ~]# docker run --name h3 -it --rm --volumes-from h1 dyc2005/bbox:v0.1.0
    #cd /data/html/
    /data/html # ls
    index.html

以上是docker学习中整理的笔记难免有错漏之处,欢迎指正!

原文地址:http://blog.51cto.com/dyc2005/2103523

时间: 2024-10-18 04:42:15

docker基础使用与入门实践的相关文章

Docker 基础命令 简要入门

所有docker都可以通过man查看帮助:man docker [ps|top|run|...] 1.列出正在运行的镜像docker ps不给参数,返回正在运行的容器-a 列出所有容器-l 列出最新创建的容器 2.启动容器docker run ID [命令] [参数]-i #为容器始终打开标准输入-t #为创建的容器提供一个伪tty终端 3.查看已建立的容器的详细信息docker inspect [ID|容器名] 4.自定义容器名docker run --name=自定义容器名 ID [命令]

Docker 入门实践

欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:张戈 导语 本文从新手视角记录了一个实际的Dokcer应用场景从创建.上传直到部署的详细过程,并简单的介绍了腾讯云容器服务的使用方法.通过Docker快速拉起一个定制服务,极大的简化了部署,加快了业务部署节奏,并降低了运维成本. ------ 人生苦短,快用Docker. 一.实践背景 初次接触Docker,按照我的学习习惯,先设计了这样一个场景case:假设有一个小型网站,想使用Nginx反向代理方案,能够在国内外快速搭建多个

Docker快速入门实践-纯干货文章

Docker快速入门实践-纯干货文章,如果细看还能发现讲解视频呦!小伙伴们赶紧猛戳吧! Docker快速入门实践-纯干货文章 老男孩教育2016启用最新的官方博文地址: http://blog.oldboyedu.com/ 欢迎小伙伴们收藏关注,干货连连!

Docker基础入门实战(一)

Docker基础入门实战 第1章          docker简介 1.1  what is Docker Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源,源代码部署在GitHub上. Docker是通过内核虚拟技术来提供容器的资源隔离与安全保障,由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,从而提高资源的利用率. Docker的目标是实现轻量级的操作系统虚拟化解决方案. 1.2 

【实战】Docker入门实践二:Docker服务基本操作 和 测试Hello World

操作环境 操作系统:CentOS7.2 内存:1GB CPU:2核 Docker服务常用命令 docker服务操作命令如下 service docker start #启动服务 service docker stop  #停止服务 service docker restart #重启服务 service docker status   #查看服务状态 启动Docker服务 docker是一个CS模型,需要先启动服务端,直接执行 sudo service docker start 启动docker

docker入门实践教程 -date: 20191108

docker入门实践教程 -date: 2019108 1.docker架构 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源. Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版) 容器非常适合持续集成和持续交付(CI / CD)工作流程.Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展

Docker基础入门及示例

Docker近几年的发展可谓一日千里,特别从是2013年随着一个基于LXC的高级容器引擎开源,到现在,其在linux和windows上都有了很好的支持,并且已经有很多公司将docker用于实际的生产环境部署当中.这篇文章我将针对以下几个方面简单介绍: 1. docker的基础介绍 2. docker在windows下的安装配置 3. 基础命令介绍 4. 使用vs2017在docker下调试 5. 打包一个.net core站点镜像 一. docker基础介绍 可能很多朋友对docker还停留在听

Docker 基础知识-入门篇

1. Docker简介和KVM区别 1.1 docker的三大理念 构建 运输 运行 ps:有点类似于java代码,一次构建到处运行 1.2 docker结构 相关说明:image: 和虚拟机的镜像类似container: 用镜像创建的实例repository: 类似于yum仓库docker client: 命令行输入的docker命令docker server: 启动的docker进程 1.3 docker和kvm的区别 1.虚拟机需要hypervisor这个中间层来进行支持,上面跑的每一个虚

Docker 基础入门

1.概念介绍 1.1 容器 1.1.1 介绍 容纳其它物品的工具,可以部分或完全封闭,被用于容纳.储存.运输物品.物体可以被放置在容器中,而容器则可以保护内容物. 1.1.2 要使用容器必须需要在内核级支持2中技术 namespaces 名称空间 Control Group(cgroups) 控制组 (1)为什么centos6 版本不能使用容器? 因为centos6 内核版本是2.6:容器需要一个user的名称空间,直到内核3.8版本才有:  namespace 系统调用参数  隔离内容  内核