抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

docker是什么?

docker目前最为火热的一种虚拟技术。和传统的虚拟技术有所不同,docker存在一个容器和镜像的概念。镜像类似于images,可以用来启动容器,容器里面可以做我们想做的操作。而容器也可以保存为新的镜像。容器之间独立运作且docker不必为每个虚拟机单独安装依赖,docker和宿主机端口映射用的是itables的方法。

docker的特点

  • 自下而上,基础设施(pc),操作系统,docker守护进程,依赖和应用
  • 不依赖于从操作系统,撇去了臃肿的从操作系统,他的启动可以说是毫秒级的
  • 多用于单例任务,如前后端分离,数据库独立,启三个docker程序来协同工作

安装

先看看nameserver有没有8.8.8.8 若没有需添加

1
vim /etc/resolv.conf  添加 nameserver 8.8.8.8

更新组件

1
yum update

添加docker下载源

1
2
3
4
5
6
7
8
sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

使用yum安装docker

1
yum install docker-engine

若下载较慢,可以尝试163的镜像源

1
2
3
4
5
cd /etc/yum.repos.d  
mv ./CentOS-Base.repo ./CentOS-Base.repo.bak
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
mv CentOS7-Base-163.repo CentOS-Base.repo
yum makecache

下载镜像,启动容器

启动docker

1
service docker start

下载第一个镜像

1
docker pull hello-world

下载完成后查看本地镜像

1
docker images

建立私有库

准备工作

server端,用作仓库所在地址。地址:192.168.10.1

client端,用作docker客户端。地址:192.168.10.2

开始操作

1.在两台机器分别安装好docker并启动

按照上述操作。

2.在server端拉取仓库镜像

1
docker pull registry:2

3.在client配置到server的hosts,稍后会用到

1
2
3
vim /etc/hosts
添加
192.168.10.1 myregistry.com

4.两台服务器都同步下时间,防止ssl证书过期

1
ntpdate cn.pool.ntp.org

5.证书制作

1
2
3
4
5
6
mkdir -p ~/certs
cd ~/certs
openssl genrsa -out myregistry.com.key 2048
openssl req -newkey rsa:4096 -nodes -sha256 -keyout myregistry.com.key -x509 -days 365 -out myregistry.com.crt
mkdir -p /etc/docker/certs.d/myregistry.com
cp myregistry.com.crt /etc/docker/certs.d/myregistry.com/

在server端生成证书

拷贝一份crt到client端

1
scp ~/certs/myregistry.com.crt root@myregistry.com:/etc/docker/certs.d/myregistry.com/

如果没有scp命令的话执行: yum install openssh-clients -y 来安装,两台服务器都安装

启动仓库镜像

在server端执行启动命令

1
2
3
4
5
6
docker run -d -p 443:5000 --name myregistry --restart=always 
-v /opt/registry-var/:/var/lib/registry/
-v /root/app/certs:/certs
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/myregistry.com.crt
-e REGISTRY_HTTP_TLS_KEY=/certs/myregistry.com.key
registry:2

解释下

  • -v ,挂载命令,-v 基本格式 宿主机路径:docker容器内部路径,这里挂了两个,一个是存放镜像,一个是访问ssl证书(certs)
  • -e 额外的指令
  • -d 表示守护模式,不在显示器打印日志
  • -p 映射端口,基本格式 宿主机ip:容器ip
  • –name 给容器起的别名
  • –restart=always 表示挂掉总是自动重启容器
  • 命令最后的registry:2表示以哪个镜像来启动容器,对应docker images中的REPOSITORY字段的值

上传镜像到私有库

在client给之前pull的hello-world打一个tag标记下,用于上传

1
docker tag myregistry.com/hello-world hello-world

查看下本地镜像,看看有没有标记上

1
docker images|grep myregistry.com/hello-world

push到私有registry

1
docker push myregistry.com/hello-world

成功push会得到下面一段话

1
2
3
The push refers to a repository [myregistry.com/hello-world]
51d9ee0d3e49: Pushed
latest: digest: sha256:2e07b350ec302816d22b9c40a45491d193e2f8ad77bf74aa104a0037852c045b size: 524

删除client上的myregistry.com/hello-world,然后从私有registry上pull

1
docker rmi xxx  # xxx为myregistry.com/hello-world的imageid

查看myregistry.com/hello-world是否从镜像里删除

1
docker images

从私有myregistry拉取

1
docker pull myregistry.com/hello-world

再次查看镜像里myregistry.com/hello-world是否pull了下来

1
docker images

加上login操作

上述操作直接进行,未加认证,可以加上用户名密码认证。

在server端进行如下操作:

1
2
mkdir -p ~/auth
docker run --entrypoint htpasswd registry:2 -Bbn name passwd ~/auth/htpasswd

启动参数加上四行:

1
2
3
4
-v ~/auth:/auth 
-e "REGISTRY_AUTH=htpasswd"
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm"
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd

client在进行push操作的时候需要login

1
docker login myregistry.com

docker常用命令简析

  • docker images
    
    1
    2
    3
    4
    5
    6
    7
    8
      
    查看镜像

    - -a所有包含历史
    - --tree显示镜像的所有层(layer)

    - ```
    docker ps
    查看正在运行的容器 - -a 表示所有容器 - -l 最近一次启动的container - -q 最近一次运行的container ID
  • docker pull centos:lastest
    
    1
    2
    3
    4
    5
      
    - 格式 containername:版本号, 不加版本号直接写containername则默认是最新版本(lastest)

    - ```
    docker run imagename:version
    - -i 以“交互模式”运行容器 -d 表示守护模式,信息不输出到桌面 - -t 表示启动后进入其命令行 - -v 表示挂载本地目录到容器知道位置 -v localpath:containerpath - -p 18080:8080 表示宿主机与容器的映射端口,容器的内部的8080映射到宿主机的18080,宿主机的18080端口向外界暴露 - /xxx/xxx.sh 写在最后表示容器启动后执行的指令 - --name containedname 给启动的容器命名
  • docker push containername 上传镜像

  • docker search centos 仓库里搜索带centos名字的公共镜像

  • docker rm containerid
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
      
    删除容器(如果已启动需先stop)

    - docker rm `docker ps -a -q` 删除所有的container
    - docker ps -a -q | xargs docker rm 删除所有的container

    - `docker rmi imageid` 删除镜像

    - `docker start/restart/stop container` 开启/停止/重启container

    - `docker exec -it 进入容器

    - `docker attach containerid/containername` 进入正在运行的容器

    - ```
    docker logs -f -t --since="2017-05-31" --tail=10 containerid
    - --since : 此参数指定了输出日志开始日期,即只输出指定日期之后的日志 - -f : 查看实时日志 - -t : 查看日志产生的日期 - -tail=10 : 查看最后的10条日志。
  • docker commit containerid(容器名也行) node:node1(为新的镜像名)

评论