Linux的企业-docker简介及操作

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介:

一.Docker

docker 是一个应用容器引擎,让开发者可以打包安装他们的应用,以及依赖包到一个可移植容器中去,然后发布到任何Linux容器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间没有任何接口。

基于go语言并遵循Apache2.0开源协议。

Docker面向对象

容器对象

镜像

 

docker在本质上是一个附加系统使用文件系统的不同层构建一个应用层是有可能的

Docer实例是无状态的他们不应该承担任何交易数据,所有的数据应该保存在数据库服务器中。

Docker基于LXC的高级容器引擎,其隔离性主要来自于namespace

Docker所提供的功能:

1Images(镜像):Docker可以通过PullPush命令构建对象到服务中心

2Containers(容器):Docker可以通过Start/Stop命令管理容器的生命周期

3Logging(日志):Docker可以通过stdoutstderro捕获输出所有的容器内部信息

4Volumes(存储):Docker可以创建和管理容器的相关文件存储

5Networking(网络):Docker可以创建管理虚拟的接口和内部所有容器之间的网络桥接

5RPCDocker服务器提供允许外部程序去控制所有容器的行为的API

@http://www.docker.org.cn/docker/70.html

 

首先在系统上安装docker服务,dockerrhel7.2系统上运行良好,在低版本的系统上有些问题。镜像去网上down

镜像的创建和销毁:

查看本地镜像:docker images

查看本地镜像详情:docker inspect +镜像名称

导入本地镜像:docker load -i +镜像名称

导出本地镜像:docker save rhel >rhel.tar

更新本地镜像:docker commit  适用于对基础镜像做一些公共性的操作,然后重新打包。

删除本地镜像:docker rmi +镜像名称 前提:该镜像没有被占用

 

容器的销毁和重建:

docker run -it --name vm1 +镜像名称 bash  交互式方法创建一个容器

 rhel系列的容器创建必须要有bash

docker run -d --name vm1+镜像名称  后台运行一个容器。

docker ps -a 查看所有容器状态

docker pa 查看当前正在运行的容器状态

docker attach vm1 连接容器

docker logs vm1 查看容器指令输出 -f 可以实时查看

docker inspect vm1 查看容器详情

docker stats vm1 查看容器资源使用率(实时)

docker diff vm1 查看容器修改

docker run -d --name vm1 rhel7 bash -c "while true; do echo westos; sleep 1; done创建后台运行并执行指令的容器

docker stop vm1 停止容器

docker start vm1 启动容器

docker kill vm1 强制中止容器

docker restart vm1 重起容器

docker pause/unpause 暂停/恢复容器。

docker export vm1 > vm1.tar 导出容器

docker import vm1.tar image  导入容器为镜像image

 

docker数据卷管理:

docker run 在创建容器时使用 -v 参数可以挂载一个或多个数据卷到当前运行的容器中,-v

的作用是将宿主机上的目录作为容器的数据卷挂载到容器中,使宿主机和容器之间可以共

享一个目录。

挂载数据卷到新创建的容器上:

# docker run -it --name westos -v /tmp/data1:/data1 -v /tmp/data2:/data2 rhel7 /bin/bash

-v 参数可以重复使用,挂载多个数据卷到容器中,冒号前面的是宿主机的目录(本地目录

不存在 docker 会自动创建),冒号后面的是容器中的挂载目录。

:docker commit 时卷的数据不会被保存。

默认挂载可以读写数据卷,也可以只读挂载:

# docker run -it --name westos2 -v /tmp/data2:/data2:ro

rhel /bin/bash

挂载宿主机文件:

#

docker

run

-it

--name

westos3

/etc/yum.repos.d/rhel-dvd.repo:/etc/yum.repos.d/rhel-dvd.repo:ro rhel7 /bin/bash

-v

数据卷容器:

# docker create --name data -v /tmp/sharedata:/sharedata rhel7 /bin/true

# docker run -it --name vm1 --volumes-from data rhel7 /bin/bash

# docker run -it --name vm2 --volumes-from data rhel7 /bin/bash

# docker attach vm1

bash-4.2# cd /sharedata/

bash-4.2# touch vm1file

# docker attach vm2

bash-4.2# cd /sharedata/

bash-4.2# ls

passwd vm1file

bash-4.2# touch vm2file

[root@foundation0 ~]# ls /tmp/sharedata/

passwd vm1file vm2file

备份数据卷:  要预先封装tar 工具进去

# docker run --rm --volumes-from data -v /tmp/backup:/backup rhel7 tar cf

/sharedata    /backup/test.tar

 

Dockerfile编写:

首先对基础镜像操作:

bash-4.2# cat /etc/yum.repos.d/rhel7.repo 

[rhel7.1]

name=rhel7.0

baseurl = http://172.25.254.33/rhel7.2

#baseurl=file:///var/www/html/rhel7.2

gpgcheck=0

 

   13  yum install -y iputils-20121221-7.el7.x86_64

   14  yum install -y net-tools-2.0-0.17.20131004git.el7.x86_64

   15  yum install -y procps-ng-3.3.10-3.el7.x86_64

   16  ps -ax

   17  yum install -y openssh-server openssh-clients 

   18  yum install -y openssh-client

   19  yum install -y openssh-clients

 

使用ctrl +p+q 退出。

提交修改过的容器:并加上tag 后缀。

[root@foundation33 ~]# docker commit vm1  rhel7:yum

 

cat Dockerfile

FROM rhel7:yum

MAINTAINER gingko@qq.com

ENV HOSTNAME server1

EXPOSE  22

RUN yum install -y openssh-server openssh-clients  && yum clean all

RUN ssh-keygen -t   rsa -f /etc/ssh/ssh_host_rsa_key -q -N ""

RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -q -N ""

RUN ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519 -q -N ""

RUN echo root:westos|chpasswd

CMD ["/usr/sbin/sshd","-D"]

 

此时,在docker images 中可以发现该镜像。可以使用该镜像创建容器。



二.安装docker

8ee7a88fd0b71b0b0e94ca8cc27c8f20.png

17382193424b0e2007000f969ad2b5d5.png

ip:

4c5289bd36d46b277388a8594636f55b.png


三.docker的使用

1.加载镜像

2f733c67e7e309c2da1db9e3739b249f.png


2.创建容器启动镜像

8757d88e988b58c39c60c87e1f758d82.png


3.保存

88f9f8a6fdc5255f679997b6719b6fb5.png


4.查看容器

78c94f9588fd1a672414a322783cfa9d.png


5.删除容器

7cc9c6a1aff178b97b10cde8e3426e40.png


6.加载一个小游戏

fcfc90dc90b40a49207fde488e28ecc5.png

查看地址

5e4d2a889f6551e8aafef8c94744ca93.png

342e1c671c41071324b50eb8f64f80a3.png

3d78312ef2d8fb25156980a55bf44b37.png


网络访问

04d1b9aee3e486f14e5c2935e0eecad5.png


创建8080映射到80端口,后台运行

7efd842f6087fa8503002e24dd0f3715.png

96c191defe1ee3be1b20691121b3f9b5.png

2f068ea7e2f86e8293f50f5015275d57.png


66ff5408ca148abcf81519b35ed92779.png

4eed9c972569525c6699946b3143584b.png



7.容器镜像里的数据与物理机共享

3f617dd0d5c9110fb6d5273d3cf1ab99.png



04e3524738d01d642b186aae30dc77bb.png

d9551d128f7ebc30d212987df2959ece.png


8.镜像里的数据备份

f831ecfa2f52db52695db828d9d64c47.png


9.用容器部署nginx

53b1889db78c802596f95aaceb894254.png


vim index.html

b5217421954bcd993b0bcc134ec57658.png

07c91a5f6291606305f5577a86bda341.png

3b1d858d5394c17411bbb2dea2a34669.png

834863bd05f59dc78bca04b794a03bcd.png

10.Container 网络模式

容器的四种网络模式:
bridge 桥接模式、host 模式、container 模式和 none 模式启动容器时可以使用 --net 参数指定,默认是桥接模式。

(1) bridge 桥接模式下的 Docker Container 在使用时,并非为开发者包办了一切。最明显的是,
该模式下 Docker Container 不具有一个公有 IP,即和宿主机的 eth0 不处于同一个网段。导致
的结果是宿主机以外的世界不能直接和容器进行通信。虽然 NAT 模式经过中间处理实现了
这一点,但是 NAT 模式仍然存在问题与不便,如:容器均需要在宿主机上竞争端口,容器
内部服务的访问者需要使用服务发现获知服务的外部端口等。另外 NAT 模式由于是在三层
网络上的实现手段,故肯定会影响网络的传输效率。


(2) host 模式是 bridge 桥接模式很好的补充。采用 host 模式的 Docker Container,可以直接使用
宿主机的 IP 地址与外界进行通信,若宿主机的 eth0 是一个公有 IP,那么容器也拥有这个公
有 IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换。当然,
有这样的方便,肯定会损失部分其他的特性,最明显的是 Docker Container 网络环境隔离性
的弱化,即容器不再拥有隔离、独立的网络栈。另外,使用 host 模式的 Docker Container 虽
然可以让容器内部的服务和传统情况无差别、无改造的使用,但是由于网络隔离性的弱
化,该容器会与宿主机共享竞争网络栈的使用;另外,容器内部将不再拥有所有的端口资
源,原因是部分端口资源已经被宿主机本身的服务占用,还有部分端口已经用以 bridge 网
络模式容器的端口映射。


(3) Container 网络模式:
(1) 查找 other container(即需要被共享网络环境的容器)的网络 namespace;
(2) 将新创建的 Docker Container(也是需要共享其他网络的容器)的 namespace,使用
other container 的 namespace。
Docker Container 的 other container 网络模式,可以用来更好的服务于容器间的通信。
在这种模式下的 Docker Container 可以通过 localhost 来访问 namespace 下的其他容器,传输
效率较高。虽然多个容器共享网络环境,但是多个容器形成的整体依然与宿主机以及其他
容器形成网络隔离。另外,这种模式还节约了一定数量的网络资源。但是需要注意的是,
它并没有改善容器与宿主机以外世界通信的情况。


(4) None 网络模式:
网络环境为 none,即不为 Docker Container 任何的网络环境。一旦 Docker Container 采用了
none 网络模式,那么容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。
可以说 none 模式为 Docker Container 做了极少的网络设定,但是俗话说得好“
少即是多”,在没有网络配置的情况下,作为 Docker 开发者,才能在这基础做其他无限多可能的网络定制
开发。这也恰巧体现了 Docker 设计理念的开放。
在 none 网络模式下分配固定 ip:
netns 是在 linux 中提供网络虚拟化的一个项目,使用 netns 网络空间虚拟化可以在本地虚拟
化出多个网络环境,目前 netns 在 lxc 容器中被用来为容器提供网络。
使用 netns 创建的网络空间独立于当前系统的网络空间,其中的网络设备以及 iptables 规则
等都是独立的,就好像进入了另外一个网络一样

配置:

使用loopback 网络设备,开启设备

1e02d95fe5ab1280f30188774bcfe60a.png


查看设备进程,修改网卡名称,在docker启动网卡

a500ff8e6ff9ebc21e5442f0b953e378.png

e8da0f1ed86625a0cf8d860dec9147a7.png


局域网正常,添加网关,可以对外通信

9ed15e63c0d3b14f13c0af0b69ed8f61.png

a439d7a12a25d29d8d354dc578cb74e3.png


11.Dockerfile 编写介绍

(1)安装docker,加载rhel7镜像,打开i该镜像,封装rhel7:v1镜像

设置rhel7里的源

028ea55cd129b5044d3702dcbcdcdd66.png

安装封装前的常用工具

256026f1e1fdecb920bbfe93ba622cc9.png

b5b2811a040db62eb23accc96604be92.png

ca00458cd3095c617f2a2b3c7fc09091.png


提交封装好的镜像,版本为rhel:v1

1dfe8f6a5ea420afd7ebf5c948b41a75.png


删除没用的容器vm1

704d6293edb96b5283fcccd55db8342b.png




(2)容器间互联:创建Dockerfile

mkdir /tmp/dockerfile

cd /tmp/dockerfile

vim index.html

e96ec6d42a012e87e98df921376ca064.png


vim Dockerfile

cad4d362226ea0752344e8541227ce49.png

# vim Dcokerfile
FROM rhel7:yum
指定基础镜像
MAINTAINER yakexi007@westos.org
作者信息
ENV HOSTNAME server1
设置容器主机名
EXPOSE 80
暴露容器端口
RUN yum install -y httpd && yum clean all
镜像操作命令
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
镜像启动命令,默认只能启动一条。



在rhel:v1的版本上创建rhel:v2,并自动安装启动相应的服务

e73f160694e4c860c7e0933ba78b5eb8.png

7389c391fab3271e5f1725380b3829c7.png


(2)启动rhel7:v2,端口正常

fff08985d6da5a9b4d70b64227300f1d.png

打开网页测试,服务安装正常

82fa2096662a78fee5563a8e481efdfe.png



12. 容器互联ssh

(1)配置Dockerfile,安装所需服务,修改ssh登陆密码


192bb654173724d8c138f9b7ca5365a5.png


(2)创建rhel:v3

4abc28f12c38739cde641acaf0ddf24f.png

413a9dd01fc7b406116eae47b2fbd22d.png


(3)用容器打开镜像rhel:v3,端口映射,服务正常

70253d81c3f2a380d06445ba5e64c70f.png


(4)2222端口ssh登陆正常

77ccb4cb2d5dc7ecbc065c238c8d66c6.png



13.使用 Supervisord
CMD 如果只有一个命令,那如果我们需要运行多个服务怎么办呢?最好的办法是分别在不同的容器中运行,通过 link 进行连接,比如先前实验中用到的 web,app,db 容器。如果一定要在一个容器中运行多个服务可以考虑用 Supervisord 来进行进程管理,方式就是将多个启动命令放入到一个启动脚本中。
首先安装 Supervisord,添加下面内容到 Dockerfile:


(1)份额古装rhel:v1镜像,在yum源中加入superisor插件


23bae89c0645edbe504d5fd4267388eb.png

914e7df1fb32e061e2f1067f2822e563.png

2616c86f4e34e247c04a0a2b9799208a.png



(2)在/tmp/docker下修改Dockerfile文件、创建supervisord.conf文件和创建docker.repo文件

e2ff5ee281f4cf11636dae00a8871b7c.png

34db2d389672c5ca63f231602a9fd2ea.png

4fdbb7e9a39067ba8401e8d354cb74ce.png

cafbe88066db100089630628f4550381.png

b3a9e23f87a95579af0433201108994b.png


e798cca31d73be7fae7104de7b036f29.png


(3)在rhel:v1基础上创建rhel:v2,并安装相关服务

fd67a907a4632970d3c6ced339162dd8.png

11acf034c29c6e8119108f48baabf382.png


(4)测试ssh服务和httpd服务

映射端口:httpd8080端口 ssh2222端口

61449d054c3da16a94a1bd094b3159f6.png

2632500fc1ef04badf2dc15f54925146.png


bd2a024b176e5e510ecfca424dd9de5f.png

14.拉取别人创建好的镜像

添加拉取地址

c9e6383776f32d893e10d856dd2456d3.png

e578c67f1bbfea535a69309f5af66d29.png

71cc689d6a87718a04cd961ba4a1a1bd.png



15.docker安全


设置特权级运行的容器:--privileged=true
有的时候我们需要容器具备更多的权限,比如操作内核模块,控制 swap 交换分区,挂载USB 磁盘,修改 MAC 地址等。
# docker run -it --name vm1 ubuntu bash

# docker run -it --privileged=true --name vm1 ubuntu bash










      本文转自一百个小排 51CTO博客,原文链接http://blog.51cto.com/anfishr/1976197:,如需转载请自行联系原作者

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
基于阿里云,构建一个企业web应用上云经典架构,让IT从业者体验企业级架构的实战训练。
相关文章
|
1天前
|
存储 Linux C++
linux信号量与PV操作知识点总结
linux信号量与PV操作知识点总结
|
3天前
|
存储 Linux
Redhat Enterprise Linux磁带机简单操作
Redhat Enterprise Linux磁带机简单操作
|
4天前
|
JSON Linux 数据格式
在宝塔Linux中安装Docker
在宝塔Linux中安装Docker
|
6天前
|
运维 监控 Linux
如何在Linux上部署1Panel运维管理面板并远程访问内网进行操作
如何在Linux上部署1Panel运维管理面板并远程访问内网进行操作
12 0
如何在Linux上部署1Panel运维管理面板并远程访问内网进行操作
|
11天前
|
Shell Linux 开发工具
【Linux】环境变量常见指令操作&基本实验(入门必看!)
【Linux】环境变量常见指令操作&基本实验(入门必看!)
|
12天前
|
存储 Linux 文件存储
Linux使用Docker部署Traefik容器并实现远程访问管理界面-1
Linux使用Docker部署Traefik容器并实现远程访问管理界面
|
13天前
|
NoSQL Linux Shell
2.Docker常用命令(linux)
2.Docker常用命令(linux)
|
13天前
|
存储 关系型数据库 MySQL
linux安装MySQL8.0,密码修改权限配置等常规操作详解
linux安装MySQL8.0,密码修改权限配置等常规操作详解
|
14天前
|
Unix 大数据 Linux
Linux系统简介与开源精神
Linux系统简介与开源精神
29 3
|
14天前
|
机器学习/深度学习 人工智能 分布式计算
人工智能平台PAI 操作报错合集之在本地构建easyrec docker镜像时遇到了无法连接docker服务如何解决
阿里云人工智能平台PAI (Platform for Artificial Intelligence) 是阿里云推出的一套全面、易用的机器学习和深度学习平台,旨在帮助企业、开发者和数据科学家快速构建、训练、部署和管理人工智能模型。在使用阿里云人工智能平台PAI进行操作时,可能会遇到各种类型的错误。以下列举了一些常见的报错情况及其可能的原因和解决方法。