欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Docker 基础入门

程序员文章站 2022-10-01 08:02:47
1、概念介绍 1.1 容器 1.1.1 介绍 容纳其它物品的工具,可以部分或完全封闭,被用于容纳、储存、运输物品。物体可以被放置在容器中,而容器则可以保护内容物。 1.1.2 要使用容器必须需要在内核级支持2中技术 namespaces 名称空间 Control Group(cgroups) 控制组 ......

1、概念介绍

1.1 容器

1.1.1 介绍

  容纳其它物品的工具,可以部分或完全封闭,被用于容纳、储存、运输物品。物体可以被放置在容器中,而容器则可以保护内容物。

 

1.1.2 要使用容器必须需要在内核级支持2中技术

  • namespaces 名称空间
  • control group(cgroups) 控制组

1)为什么centos6 版本不能使用容器?

因为centos6 内核版本是2.6;容器需要一个user的名称空间,直到内核3.8版本才有:

 namespace 系统调用参数  隔离内容  内核版本 
uts  clone_newuts  主机名和域名  2.6.19
ipc   clone_newipc 信号量、消息队列和共享内存   2.6.19
pid   clone_newpid 进程编号   2.6.24
network   clone_newnet 网络设备、网络栈、端口等   2.6.29
mount   clone_newns 挂载点(文件系统)   2.4.19
user   clone_newuser 用户和用户组   3.8

 

2control group(cgroups)

  • blkio:块设备io
  • cpu:cpu
  • cpuacct:cpu资源使用报告
  • cpuset:多处理平台上的cpu集合
  • devices:设备访问
  • memory:内存用量及报告
  • perf_event:对cgroup中的任务进行统一性能测试
  • net_cls:cgroup中的任务创建的数据报文的类别标识符

 

1.2 docker

1.2.1 介绍

  •  docker是一个开放源代码软件项目,让应用程序布署在软件货柜下的工作可以自动化进行,借此在linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化自动管理机制
  •  docker利用linux核心中的资源分离机制,例如cgroups,以及linux核心名字空间(namespaces,来创建独立的容器(containers。这可以在单一linux实体下运作,避免启动一个虚拟机造成的额外负担。linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括进程树、网络、用户id与挂载文件系统,而核心的cgroup提供资源隔离,包括cpu、存储器、block i/o与网络。从0.9版本起,dockers在使用抽象虚拟是经由libvirtlxcsystemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由linux核心提供的虚拟化的设施,
  •  依据行业分析公司“451研究dockers是有能力打包应用程序及其虚拟容器,可以在任何linux服务器上运行的依赖性工具,这有助于实现灵活性和便携性,应用程序在任何地方都可以运行,无论是公有云、私有云、单机等。

 

1.2.2 docker 运行架构

Docker 基础入门

 

2、安装启动docker

2.1 安装环境

1)依赖的基础环境

  •  64 cpu
  •  linux kernel(内核) 3.10+
  •  linux kernel cgroups and namespaces

 

2)查询自己服务器的环境

使用的服务器版本

[root@along ~]# cat /etc/redhat-release

centos linux release 7.3.1611 (core)

内核版本

[root@along ~]# uname -r

3.10.0-514.el7.x86_64

③ ip地址

[root@along ~]# hostname -i

192.168.130.101 192.168.10.101

 

2.2 安装docker

2.2.1 使用官方安装脚本自动安装

实际上就是下载一个安装脚本,再执行安装(不推荐,因为不能选择版本安装)

[root@centos7 ~]# curl -fssl https://get.docker.com | bash -s docker --mirror aliyun

 

2.2.2 centos 7 (使用yum进行安装,推荐)

1)添加docker-ce 源信息

[root@along ~]# wget -o /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

 

2)修改docker-ce

[root@along ~]# sed -i 's@download.docker.com@mirrors.tuna.tsinghua.edu.cn/docker-ce@g' /etc/yum.repos.d/docker-ce.repo

 

3)更新并安装 docker-ce

[root@centos7 ~]# yum makecache fast

[root@centos7 ~]# yum -y install docker-ce   安装的是默认最新版本

 

4)安装指定版本的docker

查看都有哪些版本

[root@centos7 ~]# yum list docker-ce.x86_64 --showduplicates | sort -r   

Docker 基础入门

 

下载指定版本,我这里下载的稳定版本

[root@centos7 ~]# yum -y install docker-ce-17.03.2.ce

 

安装报错(虚拟机中可能会遇到,如果没有报错请忽略)

error: package: docker-ce-18.03.1.ce-1.el7.centos.x86_64 (docker-ce-stable)

           requires: container-selinux >= 2.9

报错原因: docker-ce-selinux 版本过低

解决办法:https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/packages/网站下载对应版本的docker-ce-selinux,安装即可

[root@along ~]# yum -y install https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/packages/docker-ce-selinux-17.03.3.ce-1.el7.noarch.rpm

 

再次安装docker 成功

[root@centos7 ~]# yum -y install docker-ce-17.03.2.ce

 

2.2.3 ubuntu 14.04 16.04 (使用apt-get进行安装)

1)安装最新版本

# step 1: 安装必要的一些系统工具

sudo apt-get update

sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common

# step 2: 安装gpg证书

curl -fssl http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

# step 3: 写入软件源信息

sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

# step 4: 更新并安装 docker-ce

sudo apt-get -y update

sudo apt-get -y install docker-ce

 

2)安装指定版本的docker-ce:

# step 1: 查找docker-ce的版本:

# apt-cache madison docker-ce

#   docker-ce | 17.03.1~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 packages

#   docker-ce | 17.03.0~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 packages

# step 2: 安装指定版本的docker-ce: (version 例如上面的 17.03.1~ce-0~ubuntu-xenial)

# sudo apt-get -y install docker-ce=[version]

 

2.3 启动docker

2.3.1 配置docker镜像加速

多种加速方式:

  •  docker cn
  •  阿里云加速器
  •  中国科技大学
  •  ... ...

1docker cn 加速

[root@along ~]# mkdir -p /etc/docker

[root@along ~]# sudo tee /etc/docker/daemon.json <<-'eof'

{

  "registry-mirrors": ["https://registry.docker-cn.com"]

}

eof

 

2)阿里云加速器

注册阿里云账号,专用加速器地址获得路径:

        

添加加速器到配置文件

[root@along ~]# sudo tee /etc/docker/daemon.json <<-'eof'

{

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

}

eof

③ 阿里云页面有操作步骤

Docker 基础入门

 

2.3.2 启动docker服务

① 重载docker启动配置

[root@along ~]# systemctl daemon-reload 

② 将docker设为开机自启

[root@along ~]# systemctl start docker.service

③ 启动docker服务

[root@along ~]# systemctl enable docker.service

④ 查看docker版本

[root@along ~]# docker version

client:
 version:      17.03.2-ce
 api version:  1.27
 go version:   go1.7.5
 git commit:   f5ec1e2
 built:        tue jun 27 02:21:36 2017
 os/arch:      linux/amd64

server:
 version:      17.03.2-ce
 api version:  1.27 (minimum version 1.12)
 go version:   go1.7.5
 git commit:   f5ec1e2
 built:        tue jun 27 02:21:36 2017
 os/arch:      linux/amd64
 experimental: false

 

3docker 基础命令操作

3.1 镜像操作

3.1.1 搜索官方仓库镜像

[root@along ~]# docker search nginx
name                                                   description                                     stars     official   automated
nginx                                                  official build of nginx.                        10659     [ok]       
jwilder/nginx-proxy                                    automated nginx reverse proxy for docker c...   1497                 [ok]
richarvey/nginx-php-fpm                                container running nginx + php-fpm capable ...   671                  [ok]

搜索结果解释:

参数

说明

name

镜像名称

description

镜像说明

stars

点赞数量

official

是否是官方的

automated

是否是自动构建的

 

3.1.2 拉取镜像

1)根据镜像名称(tag指定版本)拉取镜像

[root@along ~]# docker pull nginx:1.14-alpine
1.14-alpine: pulling from library/nginx
cd784148e348: pull complete 
12b08f7ef616: pull complete 
65071a4e699c: pull complete 
9936647427be: pull complete 
digest: sha256:e3f77f7f4a6bb5e7820e013fa60b96602b34f5704e796cfd94b561ae73adcf96
status: downloaded newer image for nginx:1.14-alpine
[root@along ~]# docker pull busybox
using default tag: latest
latest: pulling from library/busybox
b4a6e23922dd: pull complete 
digest: sha256:8ccbac733d19c0dd4d70b4f0c1e12245b5fa3ad24758a11035ee505c629c0796
status: downloaded newer image for busybox:latest

注:alpine 版本:构建容器小镜像的发型版本

 

2)查看当前主机镜像列表

[root@along ~]# docker image ls
repository          tag                 image id            created             size
busybox             latest              758ec7f3a1ee        7 days ago          1.15 mb
nginx               1.14-alpine         c5b6f731fbc0        13 days ago         17.7 mb

 

3.1.3 导出镜像

[root@along ~]# docker image save busybox > docker-busybox.tar.gz
[root@along ~]# ls docker-busybox.tar.gz 
docker-busybox.tar.gz
[root@along ~]# docker image save -o /mnt/busybox_nginx.tar.gz busybox:latest nginx:1.14-alpine 
[root@along ~]# ls /mnt/busybox_nginx.tar.gz 
/mnt/busybox_nginx.tar.gz

注:

  • -o:指定导出镜像的位置;
  • 可以同时导出多个镜像;为一个文件;
  • 指定.tar.gz 可以导出并压缩。

 

3.1.4 删除镜像

[root@along ~]# docker image rm busybox
untagged: busybox:latest
untagged: busybox@sha256:8ccbac733d19c0dd4d70b4f0c1e12245b5fa3ad24758a11035ee505c629c0796
deleted: sha256:758ec7f3a1ee85f8f08399b55641bfb13e8c1109287ddc5e22b68c3d653152ee
deleted: sha256:23bc2b70b2014dec0ac22f27bb93e9babd08cdd6f1115d0c955b9ff22b382f5a
[root@along ~]# docker image ls
repository          tag                 image id            created             size
nginx               1.14-alpine         c5b6f731fbc0        13 days ago         17.7 mb

 

3.1.5 导入镜像

[root@along ~]# docker image load -i docker-busybox.tar.gz 
23bc2b70b201: loading layer  1.37 mb/1.37 mb
loaded image: busybox:latest
[root@along ~]# docker image ls
repository          tag                 image id            created             size
busybox             latest              758ec7f3a1ee        7 days ago          1.15 mb
nginx               1.14-alpine         c5b6f731fbc0        13 days ago         17.7 mb

 

3.1.6 查看镜像的详细信息

[root@docker01 ~]# docker image inspect centos

 

3.2 容器操作

3.2.1 启动容器

方法1(不推荐)

  先创建一个容器:docker create 镜像名

  再启动容器:docker start 容器名

方法2:docker run 镜像名

1)格式

usage: docker run [options] image [command] [arg...]

 

2options 常用命令选项

  •  -t :打开一个终端,像使用交换机一样使用容器
  •  -i:交互式访问
  •  --name:容器名字
  •  --network:指定网络
  •  --rm:容器一停,自动删除
  •  -d:剥离与当前终端的关系;否则会一直占据着终端
  •  -p:端口映射,将容器内服务的端口映射在宿主机的指定端口

 

3)示例:运行一个容器

[root@along ~]# docker run --name web1 -d -p 8888:80 nginx:1.14-alpine
ced78e522fd747635e9af01bc20882094e3b55ce50b9ae248962e8e8eeb89774
[root@along ~]# docker run --name b1 -it busybox /bin/sh  在运行容器时,交互式进入容器
/ # ls /
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # exit  退出

 

4)查询容器运行状态命令

[root@along ~]# docker ps / docker container ls  两个命令是一样的效果

  -a:查询所有的容器

注:容器内的第一个进程必须一直处于运行的状态,否则这个容器,就会处于退出状态!

[root@along ~]# docker ps   只显示运行的容器
container id        image               command                  created             status              ports                    names
ced78e522fd7        nginx:1.14-alpine   "nginx -g 'daemon ..."   5 minutes ago       up 5 minutes        0.0.0.0:8888->80/tcp     web1
[root@along ~]# docker ps -a   查询所有容器
container id        image               command                  created             status                     ports                  names
bcbf3d772a65        nginx:1.14-alpine   "nginx -g 'daemon ..."   3 minutes ago       up 3 minutes               0.0.0.0:8888->80/tcp   web1
9621f704b756        busybox             "/bin/sh"                3 minutes ago       exited (0) 3 minutes ago                          b1

 

3.2.2 停止运行的容器

docker stop  关闭运行的容器

docker kill   杀死运行的容器

  -s:指定信号,和kill 用法一样;-9 强制停止容器

[root@along ~]# docker kill web1
web1
[root@along ~]# docker ps   只显示运行的容器
container id        image               command             created             status              ports               names
[root@along ~]# docker ps -a   查询所有容器
container id        image               command                  created             status                      ports               names
bcbf3d772a65        nginx:1.14-alpine   "nginx -g 'daemon ..."   5 minutes ago       exited (137) 1 second ago                       web1
9621f704b756        busybox             "/bin/sh"                5 minutes ago       exited (0) 5 minutes ago                        b1

 

3.2.3 激活关闭的容器

docker start

1)格式

usage: docker start [options] container [container...]

 

2options:

  • -a:附加到当前终端
  • -i:交互式

 

3)示例

[root@along ~]# docker start web1
web1
[root@along ~]# docker ps
container id        image               command                  created             status              ports                   names
ced78e522fd7        nginx:1.14-alpine   "nginx -g 'daemon ..."   9 minutes ago       up 8 seconds        0.0.0.0:8888->80/tcp    web1

 

3.2.4 查看容器的详细信息

[root@along ~]# docker inspect web1
[root@along ~]# docker inspect web1 |grep "ipaddress"   比如我查询到容器的ip
            "secondaryipaddresses": null,
            "ipaddress": "172.17.0.2",
                    "ipaddress": "172.17.0.2",
[root@along ~]# curl 172.17.0.2   通过容器的ip,在宿主机*问服务
<!doctype html>
<html>
<head>
<title>welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: tahoma, verdana, arial, sans-serif;
    }
</style>
</head>
<body>
<h1>welcome to nginx!</h1>
[root@along ~]# curl 127.0.0.1:8888  映射到宿主机的端口是8888
<!doctype html>
<html>
<head>
<title>welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: tahoma, verdana, arial, sans-serif;
    }
</style>
</head>
<body>
<h1>welcome to nginx!</h1>

 

3.2.5 删除容器

[root@along ~]# docker kill web1  先关闭容器,再删除容器
b1
[root@along ~]# docker ps
container id        image               command             created             status              ports               names
[root@along ~]# docker ps -a
container id        image               command                  created             status                       ports               names
bcbf3d772a65        nginx:1.14-alpine   "nginx -g 'daemon ..."   6 minutes ago       exited (137) 2 seconds ago                       web1
9621f704b756        busybox             "/bin/sh"                6 minutes ago       exited (0) 6 minutes ago                         b1
[root@along ~]# docker rm web1
web1
[root@along ~]# docker ps -a
container id        image               command                  created             status                       ports               names
9621f704b756        busybox             "/bin/sh"                6 minutes ago       exited (0) 6 minutes ago                         b1
[root@along ~]# docker rm -f `docker ps -a -q` 删除所有容器,-f 强制删除
9621f704b756
[root@along ~]# docker ps -a
container id        image               command             created             status              ports               names

 

3.2.6 对运行的容器执行指定命令exec

[root@along ~]# docker exec / docker container exec   

1)格式

usage: docker exec [options] container command [arg...]

 

2options 选项

  •  -d:在后台运行命令
  •  -e:设置环境变量
  •  -i:交互式
  •  -t:打开一个终端
  •  -u:用户名或uid

 

3)示例

[root@along ~]# docker run --name web1 -d nginx:1.14-alpine
81f336e878c0fb3187596f2acd12705d94f532978a8ad37c9f8ae33cc39bfb61
① 交互式进入容器
[root@along ~]# docker exec -it web1 /bin/sh   
/ # ls /
bin    etc    lib    mnt    root   sbin   sys    usr
dev    home   media  proc   run    srv    tmp    var
/ # exit
② 查询ip
[root@along ~]# docker exec web1 ip a
1: lo: <loopback,up,lower_up> mtu 65536 qdisc noqueue state unknown qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
43: eth0@if44: <broadcast,multicast,up,lower_up,m-down> mtu 1500 qdisc noqueue state up 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:2/64 scope link 
       valid_lft forever preferred_lft forever

 

3.2.7 查询容器内部日志

[root@along ~]# curl 172.17.0.2
[root@along ~]# docker logs web1
172.17.0.1 - - [03/jan/2019:09:00:42 +0000] "get / http/1.1" 200 612 "-" "curl/7.29.0" "-"

 

3.2.8 一图总结对容器的操作命令

Docker 基础入门