centos7 安装使用docker

× 文章目录
  1. 1. 0x00 前言
  2. 2. 0x01 安装docker
    1. 2.1. 一键安装docker
    2. 2.2. 使用系统自带的包管理工具来安装
    3. 2.3. 手工安装docker
  3. 3. 0x02 使用docker
  4. 4. 0x03 Nginx部署示例
  5. 5. 0x04 镜像加速器
  6. 6. 0x05 docker-compose
  7. 7. 0x06 Failed to get D-Bus connection: Operation not permitted
    1. 7.1. 解决方法

0x00 前言

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE。

社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施、容器、插件等。

社区版按照stable和edge两种方式发布,每个季度更新stable版本,如17.06,17.09;每个月份更新edge版本,如17.09,17.10。

Docker里比较重要的概念有注册服务器、仓库、镜像、容器

仓库: 注册服务器是存放仓库的地方,其上往往存放着多个仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签(tag)来进行区分。例如存放Ubuntu操作系统镜像的仓库,称为Ubuntu仓库,其中可能包括14.04、12.04等不同版本的镜像。

镜像: Docker镜像(Image)类似于虚拟机镜像,可以将它理解为一个面向Docker引擎的只读模板,包含了文件系统。例如:一个镜像可以只包含一个完整的Ubuntu操作系统环境,可以把它称为一个Ubuntu镜像。

容器: 容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是相互隔离、互不可见的。可以从一个镜像创建无数个容器。平时我们主要操作的就是容器。我们也可以把容器打包成镜像以方便再次使用。镜像自身是只读的。容器从镜像启动的时候,Docker会在镜像的最上层创建一个可写层,镜像本身将保持不变。

0x01 安装docker

一键安装docker

比较推荐这种方式安装,在未按照过Docker的机器上,root权限执行如下命令即可一键最新版Docker

1
curl -s https://get.docker.com/ | sh 

使用系统自带的包管理工具来安装

  1. Docker 要求64位。并且当CentOS7时你的内核必须不小于3.10,查看你的CentOS 版本是否支持 Docker 。

    查看当前的内核版本

    1
    2
    # uname -r
    3.10.0-693.21.1.el7.x86_64
  2. 使用 root 权限登录 Centos。确保 yum 包更新到最新。

    1
    # yum -y update
  3. 安装和启动docker

    centos7 支持使用yum安装,省事很多

    1
    2
    3
    # yum install -y docker
    # systemctl start docker
    # systemctl enable docker
  4. 验证是否安装成功

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # docker version

    Client:
    Version: 1.13.1
    API version: 1.26
    Package version: docker-1.13.1-75.git8633870.el7.centos.x86_64
    Go version: go1.9.4
    Git commit: 8633870/1.13.1
    Built: Fri Sep 28 19:45:08 2018
    OS/Arch: linux/amd64

    Server:
    Version: 1.13.1
    API version: 1.26 (minimum version 1.12)
    Package version: docker-1.13.1-75.git8633870.el7.centos.x86_64
    Go version: go1.9.4
    Git commit: 8633870/1.13.1
    Built: Fri Sep 28 19:45:08 2018
    OS/Arch: linux/amd64
    Experimental: false
  5. 测试docker是否正常运行

    1
    2
    3
    4
    # docker run hello-world

    Hello from Docker!
    This message shows that your installation appears to be working correctly.

    手工安装docker

    如果你使用的操作系统不支持使用一键安装脚本,也没有包管理工具,可以选择手工安装最新版Docker。

参考文档:https://docs.docker.com/engine/installation/

0x02 使用docker

  1. 常用命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    # 查找并拉取镜像
    docker search ubuntu
    docker pull ubuntu

    # 查看所有可用镜像
    docker images -a

    # 删除镜像
    docker rmi 容器ID
    -f强制删除


    # 从镜像中创建容器(每运行一次便创建一个新的容器)
    docker run image
    > docker run ubuntu echo 'hellp world' 运行一个新的容器,并执行命令echo

    > docker run -it --name test ubuntu /bin/bash 以交互式终端运行一个新的容器,镜像ubuntu,使用bash,容器别名test
    -i 交互式界面,默认是false
    -t 伪终端,默认false
    --name 容器别名,默认随机命名
    -p 对外端口:docker内部端口

    进入镜像内部操作
    docker exec -it 容器别名 /bin/bash(镜像shell地址)

    exit 退出交互式界面,容器停止运行
    crtl + P 或Q推出交互式界面,容器在后台运行(PQ大写)

    # 查看容器
    docker ps 查看正在运行的容器
    docker ps -a 查看所有容器
    docker ps -l 查看最近一次运行的容器

    # 其他操作
    docker create 容器名或容器ID 创建容器
    docker start 容器名 启动容器
    docker run 容器名或容器ID 进入容器,相当于dcoker create + docker start
    docker attach 容器名或容器ID 进入容器的命令行
    docker stop 容器名 停止容器
    docker rm 容器名 删除容器(删除时必须是停止状态)
    docker top 容器名 查看容器的进程
    docker inspect 容器名 查看docker的底层信息
    docker commit 临时名 镜像名 保存镜像

    将主机/www/jy 目录拷贝到容器aaa923a806ca的/www目录下
    docker cp /www/jy aaa923a806ca:/www/
    将主机/www/jy 目录拷贝到容器aaa923a806ca中,目录重命名www
    docker cp /www/jy aaa923a806ca:/www
    将容器aaa923a806ca的/www目录拷贝到主机的/tmp目录
    docker cp aaa923a806ca:/www /tmp/

  2. 导入导出

    1
    2
    3
    4
    5
    6
    7
    8
    # 镜像导出导入
    docker save -o ubuntu_latest.tar ubuntu:latest
    docker load --input ubuntu_latest.tar

    # 容器导出导入
    想要导出容器必须先停止
    docker export <容器名> > <保存路径>
    docker import <文件路径> <容器名>
  3. 将容器保存为一个新的镜像

    1
    2
    docker commit -m '注释' 容器CONTAINER ID 镜像名称:镜像版本
    docker commit 23c18d958279 opencanary_agent:v1.1
  4. 守护式容器

    我们可以使用守护式容器运行一个或者多个服务,例如运行lamp服务、redis服务、mysql服务等。

    • 能够长期运行
    • 没有交互式会话
    • 适合运行应用程序和服务

    启动守护式容器

    docker run -d image

    -d 让容器在后台运行

    查看守护进行的运行状况

    docker logs [-f] [-t] [--tail] 容器名或id

    查看容器内WEB应用程序日志

    • -f –follow=true|false,默认false,一直跟随log变化
    • -t –timestamps=true|false,默认false,加上时间戳
    • –tail=”all”,返回最新多少条日志

    在容器中启动新的进程

    docker exec [-d] [-i] [-t] 容器名 [COMMOND] [ARG...]

    停止守护式进程

    docker stop 容器名 发送停止信号,等待关闭

    docker kill 容器名 直接关闭容器

0x03 Nginx部署示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 创建映射端口为80的交互式界面:
docker run -p 80 --name web -i -t ubuntu /bin/bash

# 第一次使用更新源
apt-get update

# 安装nginx
apt-get install nginx

# 安装vim
apt-get install vim

whereis nginx
nginx: /usr/sbin/nginx /etc/nginx /usr/share/nginx

# 配置文件
vim /etc/nginx/conf.d/localhost.conf

server {
listen 80;
server_name localhost;

location / {
root /var/www/;
index index.html index.htm;
}

}

# 创建一个新目录
mkdir -p /var/www/
vim /var/www/index.html

# 启动nginx
nginx

# 使用Crtl+P(即Crtl+shift+p)退出容器,并后台运行。

# 查看
docker port web
docker top web

0x04 镜像加速器

某些站点服务器在国内访问可能存在速度慢、丢包率高等问题,导致我们拉取镜像时可能会失败、卡顿,影响正常体验,所以需要使用加速器

阿里云镜像加速器

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["填你的地址"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

登陆进入管理控制台就能看到了,按照操作文档进行加速器设置

也可使用daocloud对Dockerhub进行加速

0x05 docker-compose

安装

1
pip install docker-compose

启动

1
docker-compose up -d

移除

1
docker-compose down

0x06 Failed to get D-Bus connection: Operation not permitted

想要docker化批量部署蜜罐agent,使用centos 7 镜像创建容器后,使用systemctl启动服务报错

1
2
# systemctl start rsyslog
Failed to get D-Bus connection: Operation not permitted

Docker的设计理念是在容器里面不运行后台服务,容器本身就是宿主机上的一个独立的主进程,也可以间接的理解为就是容器里运行服务的应用进程。一个容器的生命周期是围绕这个主进程存在的,所以正确的使用容器方法是将里面的服务运行在前台。

再说到systemd,这个套件已经成为主流Linux发行版(比如CentOS7、Ubuntu14+)默认的服务管理,取代了传统的SystemV风格服务管理。systemd维护系统服务程序,它需要特权去会访问Linux内核。而容器并不是一个完整的操作系统,只有一个文件系统,而且默认启动只是普通用户这样的权限访问Linux内核,也就是没有特权,所以自然就用不了!

解决方法

使用特权模式运行容器

1
2
# docker run -d --privileged=true opencanary_agent:v1.1 /usr/sbin/init
# docker exec -it ece /bin/bash