Docker基础笔记

一、docker基础

什么是容器

  • 一种虚拟化的方案
  • 容器虚拟化也叫做操作系统级别的虚拟化,只能运行相同或相似内核的操作系统,依赖于Linux内核特性:Namespace和Cgroups(Control Group)
  • 容器比虚拟机的占用空间更小
    这里写图片描述

什么是docker

docker是一个将应用程序自动部署到容器,使用Go语言开源引擎,提供简单轻量的建模方式、同一台宿主机可以运行多个容器,职责的逻辑分离,快速高效的开发生命周期,鼓励使用面向服务的架构

docker的作用

  • 开发、测试、部署服务
  • 创建隔离的运行环境
  • 搭建测试环境
  • 构建多用户的平台即服务(PaaS)基础设施
  • 提供软件即服务(SaaS)应用程序
  • 高性能、超大规模的宿主机部署

docker的基本组成

这里写图片描述

  • Docker Client客户端

  • Docker是C/S(客户端client-服务器server)架构模式。 docker通过客户端连接守护进程,通过命令向守护进程发出请求,守护进程通过一系列的操作返回结果。

  • docker客户端可以连接本地或者远程的守护进程。

  • docker客户端和服务器通过socket或RESTful API进行通信。

  • Docker Daemon守护进程

  • Docker image镜像

  • 镜像是容器的基石,容器基于镜像启动和运行。镜像就好像容器的源代码,保存了容器各种启动的条件。镜像是一个层叠的只读文件系统。

  • Docker Container容器

  • 容器通过镜像来启动,容器是docker的执行来源,可以执行一个或多个进程。镜像相当于构建和打包阶段,容器相当于启动和执行阶段。容器启动时,Docker容器可以运行、开始、停止、移动和删除。每一个Docker容器都是独立和安全的应用平台。

  • Docker Registry仓库

  • docker仓库用来保存镜像。docker仓库分为公有和私有。docker公司提供公有仓库docker hub,网址:https://hub.docker.com/。我们也可以创建自己私有的仓库。

检查Device Mapper:ls -l /sys/class/misc/device-mapper

二、docker的安装

###docker的linux安装方式一:
1、首先要检查Https支持,即查看/usr/lib/apt/methods/https文件是否存在,不存在则执行

$ sudo apt-get install -y apt-transport-https 

2、将Docker添加到APT仓库

$ echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list 

3、添加仓库的key

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys  36A1D7869245C8950F966E92D8576A8BA88D21E9 

4、安装

$ sudo apt-get update 
$ sudo apt-get install lxc-docker

###docker的linux安装方式二:
因为安装较为复杂,因此docker将安装写入了一个shell脚本中

# 若ubuntu未安装curl命令,则安装
sudo apt-get install -y curl
curl -sSL https://get.docker.com/ubuntu/ | sudo sh

###docker的linux安装方式三:

sudo apt-get update
sudo apt-get install docker.io

###docker的windows安装方式:

Boot2Docker官方下载地址:https://github.com/boot2docker/windows-installer/releases 
Boot2Docker官方安装手顺:http://docs.docker.com/installation/windows/ 

三、docker的启动

###官方案例

# 如果没有镜像会自动下载,此命令只能启动一个容器,启动第二个时会关闭第一个
sudo docker run ubuntu echo 'Hello world'

###守护式启动
能够长期运行、没有交互式回话、适合运行应用程序和服务

docker run -i -t centos /bin/bash
  • -i 以交互模式运行容器,通常与-t同时使用
  • -t 为容器重新分配一个伪输入终端,通常与-i同时使用
docker run --name=firstDockerContainer -i -t ubuntu /bin/bash
  • –name 定义启动docker的名字
    #####1、使用ctrl+p ctrl+q退出,容器就会在后台运行
    如果再想进入,则执行
docker attach {容器名}

#####2、启动时即为守护式

docker run --name=secondDockerContainer -d ubuntu /bin/bash -c "while true;do echo hello world;sleep 1;done"
  • -d 以守护方式后台运行容器

注意:

  • 使用非root用户时
#添加名为docker的用户组
sudo groupadd docker
#将当前用户添加到用户组中
sudo gpasswd -a {USERNAME} docker
#重启docker服务
sudo service docker restart
  • 非root用户,会报错
Warning: failed to get default registry endpoint from daemon (Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.26/info: dial unix /var/run/docker.sock: connect: permission denied). Using system default: https://index.docker.io/v1/Got permission denied while trying to connect to the Docker daemon socket at  unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.26/images/search?limit=25&term=ubuntu: dial unix /var/run/docker.sock: connect: permission denied
  • 在container中启动一个长久运行的进程
JOB=$(docker run -d centos /bin/sh -c "while true;do echo hello world;sleep 1;done;")
  • 查看容器环境
cat /etc/redhat-release 
  • docker镜像存储在/var/lib/docker/aufs下
  • du -sh /var/lib/docker/* docker的镜像以及一些数据都在该目录下保存
#退出容器
exit 

四、docker常用命令

###1、docker logs
从一个容器中取日志,查看标准输入或输出的内容

docker logs [-f][-t][-tail] 容器的Name/ID
-f 跟踪其变化并返回结果,值:true、false 
-t 返回结果加上时间戳,值:true、false
--tail 返回结尾处多少的日志,如果不指定则为all

###2、docker ps

# 列出所有运行中容器
docker ps 
# 列出所有运行中容器(包含沉睡镜像)
docker ps -a 

###3、docker top

# 查看容器中的进程
docker top 容器名 

###4、docker exec

# 在运行中的容器内启动新的进程,类似容器的run命令
docker exec [-d] [-i] [-t] 容器名 COMMAND 
docker exec -ti c9bc63b92bc3 /bin/bash

###5、docker inspect

# 获取容器/镜像的元数据
docker inspect {CONTAINER_ID/NAMES}	

###6、docker kill

# 杀死id为c9bc63b92bc3的容器
docker kill c9bc63b92bc3 
# 杀死一个容器
docker kill $JOB 
# kill后仍然存在,用docker ps仍然可以看见,只有rm才是移除

###7、docker rm

# 删除指定的容器(已经停止的容器)
docker rm c9bc63b92bc3 
# 强制删除指定的容器
docker rm -f c9bc63b92bc3 

###8、docker容器的启动、重启与停止

# 停止一个容器(发送指令等待容器的停止)
docker stop c9bc63b92bc3 
# 启动一个容器(重新启动一个已经停止的docker容器),如果加入-i
docker start [-i] c9bc63b92bc3 
# 重启一个容器
docker restart c9bc63b92bc3 
docker run -ti centos /bin/bash

###9、docker服务的启动、重启、停止与状态

# 查看当前docker运行状态
status docker  
# 停止docker守护进程
service docker stop	
# 启动docker守护进程
service docker start	
# 重启docker守护进程
service docker restart	

###10、docker port

# 查看容器端口的映射情况
docker port {容器名/id}

###11、docker images

# 列出所有本地镜像
docker images [-a][--no-trunc][-q][仓库名] 
-a         显示所有镜像(会出现许多没有仓库名或标签名的镜像,包含中间层镜像)
--no-trunc 将imageid全部显示出来
-q         返回imageid

注:REPOSITORY与REGISTRY

  • Repository:本身是一个仓库,这个仓库里面可以放具体的镜像,是指具体的某个镜像的仓库,比如Tomcat下面有很多个版本的镜像,它们共同组成了Tomcat的Repository。
  • Registry:镜像的仓库,比如Docker Hub,Registry上有很多的Repository,Redis、Tomcat、MySQL等Repository组成了Registry。
    ###12、docker rmi
docker rmi [-f][--no-prune] IMAGE
-f         强制删除镜像
--no-prune 保留镜像中未打标签的父镜像
docker rmi ubuntu:lastest
docker rmi [image id]
# 删除全部镜像:
docker rmi $(docker images -q ubuntu)

###13、docker search

# 可以从docker hub中搜索符合条件的镜像
docker search ubuntu

NAME(名字)、DESCRIPTION(描述)、STARS(受欢迎程度)、OFFICIAL(是否官方)、 AUTOMATED(自动根据dockerfile构建)
###14、docker pull

# 从docker hub中拉取或者更新指定镜像
docker pull ubuntu 

如果下载较慢可以使用–registry-mirror选项
1、修改/etc/default/docker
2、添加DOCKER_OPTS = "--registry-mirror=http://MIRROR-ADDR"
也可以导入image方法docker load -i centos-laster-docker-image.tar

五、docker端口映射

docker run -p 80 -i -t ubuntu /bin/bash
docker run -p 8080:80 -i -t ubuntu /bin/bash
docker run -p 0.0.0.0:80 -i -t ubuntu /bin/bash
docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash
# 把容器中80端口映射到物理机的9000端口
docker run -d -p 9000:80 centos:httpd /bin/sh -c  /usr/local/bin/start.sh
# 映射多个端口
docker run -d -p 80:80 -p 22:22 ubuntu /bin/bash
  • 修改容器的端口映射:
# 1、获取容器的id
docker inspect <容器名或id>   |  grep Id
# 2、停止容器
docker stop <容器名或id>
# 3、修改容器配置文件,容器hash由1得到
vim /var/lib/docker/containers/[容器hash]/hostconfig.json
# 4、修改PortBindings参数配置,宿主机8001端口映射容器80端口示例,一定要加入0.0.0.0,因为没加0.0.0.0会使得其他机器无法访问宿主机的端口!
"PortBindings":{"80/tcp":[{"HostIp":"0.0.0.0","HostPort":"8080″}]},
# 5、重启docker引擎
service restart docker
# 6、启动docker容器
docker start <容器名或id>

六、docker构建方式

###1、docker commit

docker commit c9bc63b92bc3 centos-me 

###2、docker build方式

mkdir /docker-build
cd /docker-build
touch Dockerfile  
# make自动化编译时需要MakeFile文件,自动化创建docker镜像,需要Dockerfile
vim Dockerfile
  • 内容
# 基于本地哪个镜像,FROM必须是第一条非注释指令
FROM centos   
# MAINTAINER 镜像的创建者、联系信息
MAINTAINER userabc <userabc@gmail.com>    
# RUN指定了当前镜像中运行的命令
# 包含SHELL模式和exec模式
# RUN 安装软件用
RUN apt-get update
# RUN 安装软件用                
RUN apt-get install -y nginx    
# 暴露的端口,可以指定多个  
EXPOSE 80			  

RUN apt-get update && apt-get install -y nginx
  • 参数
# 提供容器默认运行的命令,RUN是在构建时运行,也分为SHELL模式和EXEC模式,
# 也可作为ENTERPOINT的
CMD 
如:CMD["/usr/sbin/nginx", "-g", "daemon off;"]

# 提供容器默认运行的命令,分为SHELL模式和EXEC模式,与CMD不同的是,
# 该命令不会被docker run的命令覆盖,如果想要覆盖,需要指定 
#docker run --entrypoint 覆盖
ENTERYPOINT
如:ENTERYPOINT["/usr/sbin/nginx", "-g", "daemon off;"]

# 将文件或目录复制到目的路径中,ADD包含类似tar的解压功能,
# 如果单纯复制文件,docker推荐COPY
ADD
COPY

# 包含数据卷,该方式创建的本地数据卷是docker自动创建的,一般
# 在/var/lib/docker/vfs/dir下该方式创建的镜像是不能共享数据卷的
VOLUME
#
WORKDIR

# 设置变量,在构建或运行过程中依然有效
ENV

#
USER

# 镜像触发器,当一个镜像被其他镜像作为基础镜像时执行,
# 会在构建过程中插入指令
ONBUILD 
docker build -t='centos-me:v3' . 

docker build -t 父镜像名:自己定义的镜像名 Dockerfile文件所在的位置

###3、查看镜像的构建过程

docker history 镜像名

七、docker发布images

1、docker save -o 导出的镜像名.tar 本地镜像名

docker save -o centos-httpd-docker-image.tar centos:httpd
docker load -i centos-httpd.tar

2、注册私库
1)去https://hub.docker.com/注册一个账号
2)docker login -u userabc -p abc123 -e userabc@gmail.com
3)docker pish centos:httpd
4)docker pull userabc/centos:httpd

八、docker连接方式

unix:///var/run/docker.sock
tcp://host:port
fd://socketfd

九、docker数据卷

  • 介绍
    是经过特殊设计的目录,可以绕过联合文件系统(UFS),为一个或多个容器提供访问。

  • 目的
    数据卷设计的目的,在于数据的永久化,它完全独立与容器的生存周期,因此,docker不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾收集机制,对容器引用的数据卷进行处理。

  • 特点

  • 数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中。

  • 数据卷可以在容器之间共享和重用。

  • 可以对数据卷里的内容直接进行修改。

  • 数据卷的变化不会影响镜像的更新。

  • 卷会一直存在,即使挂载数据卷的容器已经被删除。

  • 基本操作

# 为容器添加数据卷
# /container_data为本机的文件夹
# /data为容器的文件夹
sudo docker run -v ~/container_data:/data -it ubuntu /bin/bash

# 为数据卷添加访问权限
# ro为只读权限
sudo docker run -v ~/container_data:/data:ro -it ubuntu /bin/bash

# 挂载数据卷容器的方法
# 启动dvt5容器,挂载dvt4的数据卷
docker run -it --name dvt5 --volumes-from dvt4 ubuntu /bin/bash

# 只查看Volumes的数据
# 如果使用docker rm -v dvt8,可以删除dvt8容器及其所用的数据卷,
# 但是如果数据卷在其他容器还在使用,其他容器仍然可以访问其内容
docker inspect --format="{{.Volumes}}" {容器名/id}

# docker数据卷的备份与还原
# 备份:
docker run --volumes-from [container name] -v $(pwd):/backup ubuntu
tar cvf /backup/backup.tar [container name]
docker run --volumes-from dvt5 -v ~/backup:/backup:wr --name dvt10 ubuntu tar cvf /backup/dvt5.tar /data

# 还原:
docker run --volumes-from [container name] -v $(pwd):/backup ubuntu
tar xvf /backup/backup.tar [container name]
docker run --volumes-from dvt5 -v ~/backup:/backup:wr --name dvt10 ubuntu tar xvf /backup/dvt5.tar /data
  • 数据卷容器
    命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器就叫做数据卷容器

十、docker虚拟网桥

可以设置IP地址,相当于拥有一个隐藏的虚拟网卡

# 安装网桥工具
apt-get install bridge-utils

# 查看现有的网桥设备
sudo brctl show

# 修改docker0的ip地址
sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0

# 添加虚拟网桥
sudo brctl addbr br0
sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0

# 更改docker守护进程的启动配置
# /etc/default/docker 中添加 DOCKER_OPS 值
# -b = br0
DOCKER_OPS = "-b = br0"

# 通过linked关联
docker run -it --name cct2 --link=cct1:webtest ubuntu
# 连接cct1服务器,并起一个别名为webtest,则在新的docker容器内,可以ping webtest

# /etc/default/docker 中添加 DOCKER_OPS 值
# 可以使用--icc=false使容器拒绝所有连接
DOCKER_OPS = "--icc=false"
# 以下设置的意思为拒绝所有连接,除了使用link标识的容器
DOCKER_OPS = "--icc=false  --iptables=true"

# 然后使用
docker run -it --name cct3 --link=cct1:webtest ubuntu
# 发现cct3不能连接cct1
# 这是因为当启动服务时,需要将iptables清空,据说是docker的BUG,然后重启docker,则可以连接了

# ip-forward系统是否会转发流量
--ip-forward=true

# 查看ip-forward的值
sudo sysctl net.ipv4.conf.all.forwarding

# iptables是与linux内核集成的包过滤防火墙系统
# 表:FILTER
# 链:INPUT/FORWARD/OUTPUT
# 规则:ACCEPT/REJECT/DROP
sudo iptables -L -n
sudo iptables -I DOCKER -s 10.211.55.3 -d 172.17.0.7 -p TCP --dport 80 -j DROP

十一、docker部署nginx简单实例

# 创建映射80端口的交互式容器
docker run -p 80 --name web -i -t ubuntu /bin/bash

# 安装nginx
apt-get install -y nginx

# 如果出现E: Unable to locate package nginx报错
# 这个命令的作用是:同步 /etc/apt/sources.list 和 
# /etc/apt/sources.list.d 中列出的源的索引,
# 这样才能获取到最新的软件包。
apt-get update 

# 创建文本编辑器vim
apt-get install -y vim

# 创建静态页面
mkdir -p /var/www/html
cd /var/www/html
vim index.html

# 输入一些值保存

# 修改nginx配置文件

# 查看nginx安装在哪里
whereis nginx 

# 打开其default文件修改其root值为静态网站的位置

# 运行nginx
nginx

# 查看当前进程
ps -ef 

# ctrl+p ctrl+q退出

# 验证网站访问

# 查看容器端口情况
docker port web

# 查看容器进程运行情况
docker top web

# (127.0.0.1:被映射端口、或者docker容器的ip:80)验证是否可以访问 
curl http地址

此时需要注意:当我们重启docker的容器时,其访问的ip地址和被映射的端口号都会发生改变

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值