docker基础 + 安装

Docker

DOCKER介绍

Docker是基于Go语言实现的云开源项目。Docker的容器机制,可以让服务在系统之上完成配置,而不与系统其它服务的运行配置产生冲突。通过docker打包应用,在进行应用迁移时,只需要在新的服务器上启动需要的容器即可。(Centos上的容器,可以直接移动到ubuntu上运行)

DOCKER的一些基本概念

docker镜像(iamges):
Docker镜像类似虚拟机概念,是一个面向docker引擎的模板,包括了文件系统。
docker容器(container):
容器是从镜像创建的运行实例,可以将其启动,开始,停止,删除。容器本身是相互隔离,不可见的。可以把容器开做一个简易版的linux系统,它包括了用户权限,进程空间,用户空间,网络等概念。
docker仓库(hub):
Docker 仓库是docker集中存放镜像文件的场所。
根据镜像公开分享与否,docker仓库分为私有仓库和公开仓库。目前最大的共有仓库是docker hub,如果用户不希望公开分享自己的镜像文件,docker也支持用户在本地网络建立一个自己访问的私有仓库。
docker层级(layers):
Docker镜像是由多个文件系统(只读层)叠加而成,每个层仅包含了前一层的部分。当我们启动一个镜像时,docker会加载镜像层,并在其上添加一个可写层。容器上做的任何修改,如文件创建,删除,等都将记录在可写层上。

Docker 容器介绍:

Docker的容器是基于镜像创建而来。使用docker run运行容器时,若镜像不存在,默认会从docker hub上下载镜像。
docker的容器存在终止和运行态。docker并不会主动删除容器,除非在运行时指定了--rm参数,或者在容器终止时调用docker rm指令。
Docker容器支持创建(CREATED),启用(start),停止(stop)和运行(running),四个主要操作。使用docker run指令后容器处于运行状态,在容器没有退出时,使用docker ps -a可以查看到当前容器已经运行的时间。若随后容器自动退出,使用docker ps -a可以查看到容器多少时间前处于运行态,此时容器为终止态。
Docker stop可用于终止运行的容器,docker start可以用于运行一个终止的容器,docker restart可以令一个容器先终止,再运行。

Docker安装:

Docker分为CE(社区版)和EE(企业版),这里主要做CE版本的相关记录。
Docker的安装条件是
Docker支持多种安装方式,yum网络安装和下载网络包后的本地安装

Centos安装步骤:

参考链接:
  • 安装docker仓库
sudo  yum install -y yum-utils device-mapper-persistent-data lvm2
  • 安装docker的源
 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • 安装docker ce:
        sudo yum install docker-ce
  安装完成后docer ce并没有启动,docker的组也会创建,但是组内没有用户
  使用docker -v确认成功
  • 启动docker:
systemctl start docker
  • 运行docker测试镜像:
docker run hello-world
docker运行的镜像,会自动从云仓库下载
其它说明:
可以使用如下指令查看仓库中所有docker版本:
yum list docker-ce --showduplicates | sort -r
安装指定版本的docker:
yum install docker-ce-<VERSION STRING>

Ubuntu安装步骤:

参考链接:
准备仓库:
         apt-get update
         apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
         curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
         apt-key fingerprint 0EBFCD88
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu  $(lsb_release -cs) stable"
安装docker引擎
         apt-get update
apt-get install docker-ce docker-ce-cli containerd.io
测试安装:
         docker run hello-world

 

 
 
 
 

Docker容器退出和容器关闭

容器的七种状态:
created | restarting | running | removing | paused | exited | dead
进入容器后退出但不关闭容器的方法:Ctrl + P + Q
保持容器为运行态,必须保证有一个持续运行的程序(无论是脚本,还是其它)
如:
docker run -it ubuntu bash
当我们运行以上指令时,会进入docker容器,且使用docker ps 也能查看到该容器正在运行。但是当我们退出容器(:Ctrl + P + Q)时,会发现无法使用docker ps 查看到容器了。只有使用docker ps -a才能看到容器,且容器状态为退出。
故在运行容器时,必须有一个持续运行的后台进程,使用如:
docker run -d centos /bin/bash -c “nohup ping -i 1000 www.baidu.com”
以上指令通过每1000秒ping一次百度,保证了容器一直有一个后台在运行。
常用的退出容器方法:
一般在进入容器后,若手动执行exit也会导致容器关闭。
容器与数据:
只要docker容器没被执行docker rm,无论是在容器内部退出容器还是手动stop或者kill,容器内的数据都不会删除。

 

DOCKER 网络配置

docker run创建容器时,可以使用--net选项指定容器的网络模式,docker有以下4种模式:
bridge模式:使用 --net=bridge指定,默认设置,连接到默认网桥。
host模式:使用--net=host指定,通知docker不要将容器网络放到隔离的名字空间中,即不要容器化容器内的网络。此时容器使用本地主机的网络,它拥有完全的本地主机接口访问权限。此时容器进程可以和主机其它root进程一样可以打开某些端口,访问本地网络服务,如D-bus,还可以让容器做一些影响整个主机系统的事情。
none模式:使用--net=none指定,docker将新容器放到隔离的网络栈种,但是不进行网络配置,之后用户可以自己进行配置
container模式:使用--net=container
1、bridge方式: -–net=bridge
Bridge模式是docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将并将一个主机上的Docker容器连接到一个虚拟网桥上。当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般Docker会使用172.17.0.0/16这个网段,并将172.17.42.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理端口,在宿主机上作为一块虚拟网卡使用,此时容器与主机的网络是通的)。
2、none方式: –-net=none
         在none模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
3、host方式: –-net=host
         如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
使用host模式启动容器后可以发现,使用ip addr查看网络环境时,看到的都是宿主机上的信息。这种方式创建出来的容器,可以看到host上的所有网络设备。
容器中,对这些设备有全部的访问权限。因此docker提示我们,这种方式是不安全的。如果在隔离良好的环境中(比如租户的虚拟机中)使用这种方式,问题不大。
  1. container复用方式: –-net=container:name or id
    新创建的容器和已经存在的一个容器共享一个IP网络资源

 

DOCKER镜像和DOCKER容器

DOCKERFILE

Dockerfile是一个用于编写docker镜像生成过程的文件,有特定的语法。在一个文件夹中,如果有一个名为dockerfile的文件,且其内容满足语法要求,在这个文件夹路径下执行命令:docker build --tag name:tag,就可以按照描述构建一个镜像,name是镜像的名称,tag是镜像的版本或者是编号,不写就是lastest。

基本结构:

一般而言dockerfile分为四部分:基础镜像部分,维护者信息,镜像操作指令和容器启动时执行指令。
Dockerfile支持#开头的注释行.
例:
# This  dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command]
#第一行必须指定基础镜像
FROM ubuntu
#维护者信息
MAINTAINER docker_user docker_user@email.com
#镜像的操作指令
RUN echo “XXXXXXX” >> /etc/apt/sources.list
#容器启动时执行指令
CMD /usr/sbin/nginx
一开始必须指明所基于的镜像名称,接下来一般会说明维护者信息。
后面则是镜像操作指令,例如RUN指令,RUN指令将对镜像执行跟随的命令。每运行一条RUN指令,镜像添加新的一层,并提交。最后是CMD指令,来指定运行容器时的操作指令。

指令

Dockerfile的基本指令有十三个,分别是:FROM,MAINTAINER,RUN,CMD,EXPOSE,ENV,ADD,COPY,ENTRYPOINT,VOLUME,USER,WORKDIR,ONBUILD。

FROM:

FROM <image>:<tag>
第一个指令必须为FROM指令。并且,如果在同一个dockerfile中创建多个镜像时,可以使用多个FROM指令。
tag的默认值是latest

MAINTAINER:

MAINTAINER <name>
指定维护者信息

RUN:

RUN <command> 或者 RUN [ “executable”, “param1”, “param2” ]
CMD:
 
 

Docker常见问题汇总

Docker后台未启动

[lsl@localhost docker]$ docker pull debian
Using default tag: latest
Warning: failed to get default registry endpoint from daemon (Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?). Using system default: https://index.docker.io/v1/
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[lsl@localhost docker]$ systemctl status docker.service
· docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: https://docs.docker.com
[lsl@localhost docker]$
[lsl@localhost docker]$ systemctl start docker
 
 
安装提示container.io问题
        根据提示使用--nobest参数即可
 
 
 

镜像资源下载超时

Error response from daemon: Get https://registry-1.docker.io/v2/library/mysql/manifests/5.7: Get https://auth.docker.io/token?scope=repository%3Alibrary%2Fmysql%3Apull&service=registry.docker.io: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
指定镜像资源未国内
[lsl@localhost docker]$ sudo docker pull daocloud.io/debian
[sudo] lsl 的密码:
Using default tag: latest
latest: Pulling from debian
c73ab1c6897b: Downloading [==============================>                    ]  27.28MB/45.14MB

 

posted @ 2020-12-19 23:51  dos_hello_world  阅读(298)  评论(0)    收藏  举报