概述
一、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地址和被映射的端口号都会发生改变
最后
以上就是鳗鱼毛巾为你收集整理的Docker基础笔记的全部内容,希望文章能够帮你解决Docker基础笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复