docker 学习一

一、docker介绍
Docker 中文社区中心 :http://www.docker.org.cn/
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。
Docker 在如下几个方面具有较大的优势:
1、更快速的交付和部署
2、更高效的虚拟化 :Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化
3、更轻松的迁移和扩展
4、更简单的管理
Docker是CS架构:
1) Docker daemon: 运行在宿主机上,Docker守护进程,用户通过Docker client(Docker命令)与Docker daemon交互
2) Docker client: Docker 命令行工具,是用户使用Docker的主要方式,Docker client与Docker daemon通信并将结果返回给用户,Docker client也可以通过socket或者RESTful api访问远程的Docker daemon

Docker的组成:
镜像就相当于打包好的版本,镜像启动之后运行在容器中,仓库就是装存储镜像的地方。
1)Docker image 镜像 :镜像是只读的,镜像中包含有需要运行的文件。镜像用来创建container,一个镜像可以运行多个container;镜像可以通过Dockerfile创建,也可以从Docker hub/registry上下载。镜像是启动容器的核心,采用分层技术设计,使用快照的COW技术,确保底层数据不丢失。
2)Docker container 容器:容器是Docker的运行组件,启动一个镜像就是一个容器,容器是一个隔离环境,多个容器之间不会相互影响;
3)Docker hub/registry 仓库: 共享和管理Docker镜像,用户可以上传或者下载上面的镜像,官方地址为 https://registry.hub.docker.com/,也可以搭建自己私有的Docker registry。Docker 中国官方镜像加速可通过 registry.docker-cn.com访问

Docker的三大特性为BUILD(构建)、SHIP(运输)、RUN(运行)。


Docker 的核心组件包括:
——Docker Client : Docker 客户端,是 Docker 提供命令行界面(CLI)工具,客户端可以构建,运行和停止应用程序,还可以远程与 Docker_Host 进行交互。

——Docker Daemon : Docker Daemon 是服务器组件,以 Linux 后台服务的方式运行,Docker Daemon 可以认为是通过 Docker Server 模块接受 Docker Client 的请求,并在 Engine 中处理请求,然后根据请求类型,创建出指定的 Job 并运行。 Docker Daemon 运行在 Docker Host 上,负责创建、运行、监控容器,构建、存储镜像。
1)启动 Docker Daemon 时,一般可以使用以下命令来完成:
docker --daemon = truedocker –d
docker –d = true

2) 默认配置下,Docker Daemon 只能响应来自本地 Host 的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开 TCP 监听。
①编辑配置文件/etc/systemd/system/multi-user.target.wants/docker.service,在环境变量 ExecStart 后面添加 -H tcp://0.0.0.0,允许来自任意 IP 的客户端连接。
②重启 Docker Daemon: #systemctl daemon-reload #systemctl restart docker.service
》》》即可实现与远程服务器通信:#docker -H 服务器IP地址 info (-H 是用来指定服务器主机,info 子命令用于查看 Docker 服务器的信息。)

——Docker Image :Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
1)将镜像的内容和创建步骤描述在一个文本文件中,这个文件被称作 Dockerfile ,通过执行 docker build 命令可以构建出 Docker 镜像。
2)镜像有多种生成方法:从无到有开始创建镜像;下载并使用别人创建好的现成的镜像;在现有镜像上创建新的镜像

——Docker Registry :Docker Registry 是存储 Docker Image 的仓库,运行 docker push、docker pull、docker search 时,实际上是通过 Docker Daemon 与 Docker Registry 通信。

——Docker Container :Docker 容器就是 Docker 镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方。

  1. 容器启动过程如下:Docker 客户端执行 docker run 命令——Docker Daemon 发现本地没有 hello-world 镜像——Daemon 从 Docker Hub 下载镜像——下载完成,镜像 hello-world 被保存到本地——Docker Daemon 启动容器。
    去 Docker Hub 上去下载的镜像,被默认保存到 /var/lib/docker 目录下。

docker 安装
https://docs.docker.com/install/linux/docker-ce/centos/ 安装资料

  1. 安装docker所需要的软件:
    #yum install -y yum-utils device-mapper-persistent-data lvm2
  2. 配置docker的yum源:
    yum-config-manager
    –add-repo
    https://download.docker.com/linux/centos/docker-ce.repo
  3. 启用夜间或测试存储库:
    #yum-config-manager --enable docker-ce-nightly
    #yum-config-manager --enable docker-ce-test
    禁用夜间或测试存储库:
    #yum-config-manager --disable docker-ce-nightly
    #yum-config-manager --disable docker-ce-test
  4. 安装Docker CE和容器:
    #yum install docker-ce docker-ce-cli containerd.ios
  5. 安装特定版本的Docker CE,在repo中列出可用版本
    #yum list docker-ce --showduplicates | sort -r
    #yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.ios
    6) 启动docker
    #systemctl start docker
    7)通过运行hello-world映像,验证Docker CE是否正确安装。
    #docker run hello-world
    8) 创建一个用户登录docker
    #usermod -aG docker your-user

案例:停止禁用防火墙
systemctl stop firewalld
systemctl mask firewalld
禁用 selinux
配置 yum 源,安装 docker
yum install docker-engine
启动测试
systemctl start docker
ifconfig 启动后可以看见 docker0
docker version ##docker版本
搜索 docker search
下载 docker pull busybox
查看帮助 docker help docker images
导入镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@localhost ~]# docker load <busybox.tar
c5183829c43c: Loading layer 1.36 MB/1.36 MB
Loaded image: busybox:latest32.77 kB/1.36 MB
[root@localhost ~]# docker images ##查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest f6e427c148a7 3 weeks ago 1.146 MB
导出镜像
docker save busybox >busybox.tar
**导入所有文件 docker load < xx.tar **
unzip docker_img.zip
cd docker_images
for i in *;do docker load <${i};done
利用镜像启动容器
docker run -it busybox /bin/sh
docker run -it centos /bin/bash
查看容器信息
docker ps
查看镜像底层详细信息
docker inspect 21d2aeb977cc
docker inspect -f ‘{.NetworkSettings.IPAddress}’ 21d2aeb977cc

docker 问题列表,及解答
问题:docker run -it busybox /bin/bash 报错问题
原因:
最后的命令是容器内部命令,容器内,存在才可以执行可以不指定,不指定启动默认命令
问题:docker run -it centos 退出后,配置全部丢失
原因:
run 启动的是新的容器,老的容器退出后就停止了。启动管理一个老的容器可以使用 docker start|stop|restart
问题:老容器启动以后,怎么在进入?
docker exec -it 容器id /bin/bash
docker attach 容器id
exec 与 attach 的区别
exec 单独启动命令运行,与容器启动的终端无关
attach 不启动新的命令,直接连接 console 终端
exec 退出不会影响容器的运行
attach 退出后,容器结束
问题:如果我使用attach 连接容器后,怎么才能不结束容器?
解决方法:把容器放后台,使用快捷键 ctrl + pq
问题:attach 为什么退出后,容器会结束?
因为 attach 连接进容器的 pid 1 的进程,当 attach 结束时候,pid 为 1 的进程被结束
所有整个容器被销毁
问题:docker run -it nginx 没响应?
因为 nginx 启动的默认 cmd 时 nginx daemon,该进程不是一个交互式的进程
**docker run 使用
-i 交互式的
-t 分配终端
-d 把容器放在后台运行 **
docker run -it centos cmd 启动一个交互式的容器,在前台运行
docker run -d centos cmd 启动一个非交互式的容器,在后台运行
docker run -itd centos cmd 启动一个交互式的容器,在后台运行
测试
docker run -it centos /bin/bash 成功
docker run -d centos /bin/bash 失败
docker run -itd centos /bin/bash 成功
docker run -it nginx nginx 失败
docker run -d nginx nginx 失败
docker run -itd nginx nginx 失败
docker run -it nginx nginx -g “daemon off;” 成功
docker run -d nginx nginx -g “daemon off;” 成功
docker run -itd nginx nginx -g “daemon off;” 成功
交互式的进程启动要使用 it , 非交互式的使用 d ,交互式的放后台使用 itd
启动 bash 的正确姿势 docker run -itd centos
启动 nginx 的正确姿势 docker run -d -p 80:80 nginx
小练习: 启动一个 nginx 的容器,修改默认首页为 “hello world”
设置IP伪装访问网络
[root@room9pc19 docker]# ifconfig
enp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.40.50.119 netmask 255.255.255.0 broadcast 172.40.50.255
物理机上查找上网用的网卡
打开路由转发
sysctl -w net.ipv4.ip_forward=1
设置伪装上网
[root@room9pc19 docker]# iptables -t nat -I POSTROUTING -s 192.168.4.0/24 -o enp2s0 -j MASQUERADE
在虚拟机里面设置默认路由
ip route replace default via 192.168.4.254
模拟 docker 端口绑定转发
iptables -t nat -I PREROUTING -d 192.168.4.10 -p tcp --dport 8080 -i eth0 -j DNAT --to 172.17.0.3:80
docker run -d -p 8080:80 nginx


卸载docker:
1 yum remove docker
2 docker-client
3 docker-client-latest
4 docker-common
5 docker-latest
6 docker-latest-logrotate
7 docker-logrotate
8 docker-selinux
9 docker-engine-selinux
10 docker-engine
11
12 rm -rf /etc/systemd/system/docker.service.d
14 rm -rf /var/lib/docker
16 rm -rf /var/run/docker


Docker 基本命令
1、镜像常用命令
——docker images //查看镜像列表
——docker history //查看镜像制作历史
——docker inspect //查看镜像底层信息
——docker pull //下载镜像
——docker push //上传镜像
——docker rmi //删除本地镜像
——docker save //镜像另存为tar包
——docker load //使用tar包导入镜像
——docker search //搜索镜像
——docker tag //修改镜像名称和标签
——docker ps -a //查看当前有哪些容器,包括未运行的
——docker start container_name/container_id //启动某个容器
——docker restart container_name/container_id //重启某个容器
——docker stop container_name/container_id //停止某个容器
——docker attach container_name/container_id //进入到某个容器
2、 那如果想运行某容器中的镜像的话,并且调用镜像里面的 bash ,使用:
—— #docker run -t -i container_name/container_id /bin/bash
若想删除指定镜像的话,由于 Image 被某个 Container 引用(拿来运行),要先将该 Container 销毁(删除),再删除 Image 。
——先停止容器:#docker ps -a
docker stop container_name/container_id
——再删除容器:#docker rm container_name/container_id
——再删除镜像:docker rmi image_name


docker run 参数:
参数说明:
-d :后台启动;
-h : hostname
-p :容器的端口映射
–name : 容器的名字
–restart always 当容器退出或宿主主机重启的时候,容器接着会始终重启
-v :给容器添加一个数据卷


**使用Dockerfile构建一个镜像 **
简介 :Dockerfile 是自动构建 Docker 镜像的配置文件,用户可以使用 Dockerfile 快速创建自定义的镜像。Dockerfile 是由一行行命令语句组成,并且支持已 # 开头的注释行。
Dockerfile的基本指令有十三个,分别是:FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD.

将 Dockerfile 文件分为四个部分:
1)基础镜像(父镜像)信息指令 FROM
FROM 是用于指定基础的 images ,一般格式为 FROM or FORM :。所有的 Dockerfile 都应该以 FROM 开头,FROM 命令指明 Dockerfile 所创建的镜像文件以什么镜像为基础,FROM 以后的所有指令都会在 FROM 的基础上进行创建镜像。

2)维护者信息指令 MAINTAINER
MAINTAINER 是用于指定镜像创建者和联系方式,一般格式为 MAINTAINER

3)镜像操作指令 RUN 、EVN 、ADD 和 WORKDIR 等
WORKDIR 用于配合 RUN,CMD,ENTRYPOINT 命令设置当前工作路径。一般格式为 WORKDIR /path/to/work/dir。
RUN 用于容器内部执行命令。每个 RUN 命令相当于在原有的镜像基础上添加了一个改动层,原有的镜像不会有变化。一般格式为 RUN 。
EXPOSE 命令用来指定对外开放的端口。一般格式为 EXPOSE […]。

4)容器启动指令 CMD 、ENTRYPOINT 和 USER 等
ENTRYPOINT 可以让你的容器表现得像一个可执行程序一样。一个 Dockerfile 中只能有一个 ENTRYPOINT,如果有多个,则最后一个生效。
ENTRYPOINT 命令也有两种格式:ENTRYPOINT [“executable”, “param1”, “param2”] :推荐使用的 Exec 形式。
ENTRYPOINT command param1 param2 :Shell 形式。
CMD 命令用于启动容器时默认执行的命令,CMD 命令可以包含可执行文件,也可以不包含可执行文件。一个 Dockerfile 中只能有一个 CMD,如果有多个,则最后一个生效。而 CMD 的 Shell 形式默认调用 /bin/sh -c 执行命令。
CMD 命令有三种格式:
CMD [“executable”,“param1”,“param2”]:推荐使用的 exec 形式;
CMD [“param1”,“param2”]:无可执行程序形式;
CMD command param1 param2:Shell 形式。


docker build [option | PATH |URL] 创建镜像
docker build --help
1.–tag  给镜像命名和打标签,格式时name:tag
  2.–rm  构建成功后移除临时容器
  3.–no-cache 构建镜像时不使用缓存
  4.–force-rm  总是移除临时容器(与rm相比失败也移除)


docker commit [option] CONTAINE [REPOSITORY[:TAG]] 修改一个容器来构建镜像
1.–author  注明镜像的构建作者
  2.–change  使用Dockerfile指令来创建镜像
  3.–message 提交的信息
  4.–pause   提交时暂停容器(默认true)


docker exec [oprtion] container command [ARG…] 在一个运行中的容器中执行命令
1.–detach     分离模式:在后台运行一个命令
  2.–detach-keys   和上面的attach命令的作用相同,覆写离开容器的键
  3.–env       设置环境变量
  4.–interactive   保持输入流的打开,即时没有连接
  5.–privileged    给命令赋予权限,测试时容器创建的时候没有带这个参数这里设置了好像也不起作用,run命令的时候有才会生效
  6.–tty       分配一个伪终端,通常和-i连用,进入容器
  7.–user      登入用户
docker exec -it 容器名 /bin/bash 进入容器的终端,退出时不会关闭容器
docker attach 进入容器,exit会导致容器关闭


docker history [option] IMAGE 展示一个镜像的历史
1.–human    阅读友好的展示方式,默认为true
  2.–no-trunc    不要缩略输出,一般输出命令那段会有折叠,想看到完整的指令,可以使用这个选项
  3.–quiet     只显示ID
docker history 镜像名/ID


** docker images [ option ] [repository [:TAG] ] 展示镜像列表 **
1.–all    展示所有的镜像(默认隐藏中间镜像)
  2.–digests  显示数字编号
  3.–filter   根据提供的条件过滤输出
  4.–format  使用一个GO模板合适的打印镜像
  5.–no-trunc 不缩略输出内容
  6.–quiet   只显示数字ID


login、logout、pull、push、search
这几个命令都和docker的中央镜像仓库有关,login登入,logout登出。pull拉取镜像不需要登录,push提交需要。search可以用于查看仓库中的镜像列表。

rm、rmi、run、start、stop
这几个命令和docker镜像容器的生命周期有关,rm删除容器,rmi删除镜像,run以镜像为模板新建一个容器运行,没有镜像会先拉去镜像,start启动容器,stop停止容器。rm,不能删除正在运行的容器。

docker tag 重命名镜像名称(复制)
docker top 查看容器进程列表

**docker ps 查看正在运行的容器
docker ps -a 查看所有容器列表
docker ps -aq 仅显示容器id **


案例1:编写Dockerfile 文件,使用nginx镜像启动容器
1)创建目录 ,Dockerfile 文件
#mkdir static_web
#cd static_web
#touch Dockerfile
#vim Dockerfile
FROM nginx
MAINTAINER Angel_Kitty
RUN echo ’

Hello, Docker!

’ > /usr/share/nginx/html/index.html
2) 在 Dockerfile 文件所在目录执行:
#docker build -t angelkitty/nginx_web:v1 . (最后的点号一定要有)
-t 是为新镜像设置仓库和名称;angelkitty 为仓库名 ;nginx_web 为镜像名 ;v1 为标签(不添加为默认 latest )
3) #Docker Images //查看所有镜像
4) 使用 docker run 命令来启动容器:
#docker run --name nginx_web -d -p 8080:80 angelkitty/nginx_web:v1
该命令会用 Nginx 镜像启动一个容器,命名为 nginx_web ,并且映射了 8080 端口。
#curl http://localhost:8080/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值