Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙盒机制,相互之间不会有任何接口(减少耦合)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包装系统
沙盒也叫沙箱,英文 sandbox。在计算机领域指一种虚拟技术,且多用于计算机安全技术。安全软件可以先让它在沙盒中运行,如果含有恶意行为,则禁止程序的进一步运行,而这不会对系统造成任何危害。
LXC 为 Linux Container 的简写。Linux Container 容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性
Docker 是 dotCloud 公司开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于 go语言并遵从 Apache2.0 协议开源。
Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的 container 中,然后发布到任何流行的 Linux 机器上
工作流程:服务器 A 上运行 docker Engine 服务,在 docker Engine 上启动很多容器 container ,从外网 Docker Hub 上把 image 操作系统镜像下载来,放到 container 容器运行。这样一个容器的实例就运行起来了
PS:Docker相当于少了虚拟机这一层次 因此运行效率特别快 启动一个Docker实例1-2S即可
# 安装依赖
[root@SR ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置国内 docker 的 yum 源(阿里云)
[root@SR ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装 docker-ce
[root@SR ~]# yum install docker-ce docker-ce-cli containerd.io -y
‘‘‘
注:docker-ce-cli 作用是 docker 命令行工具包
containerd.io 作用是容器接口相关包
yum info 软件包的名字,可以查看一个包的具体作用。
‘‘‘
# 启动Docker
[root@SR ~]# systemctl start docker && systemctl enable docker
# 查看docker版本
[root@SR ~]# docker version
# 查看docker信息
[root@SR ~]# docker info
[root@SR ~]# docker search centos # 查看镜像
[root@SR ~]# docker pull centos # 拉取镜像 因为服务器在国外可能会拉取失败
[root@SR ~]# docker images # 查看拉取的镜像
[root@SR ~]# docker pull hub.c.163.com/library/tomcat:latest # 指定镜像源下载
[root@SR ~]# docker images # 查看拉取的镜像
[root@SR ~]# docker load -i docker-centos7.tar
[root@SR ~]# vim /etc/docker/daemon.json # 创建配置文件
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"live-restore": true
}
[root@SR ~]# systemctl daemon-reload
[root@SR ~]# systemctl restart docker
[root@info ~]# docker info
# PS此方法不推荐
[root@SR ~]# vim /usr/lib/systemd/system/docker.service
‘‘‘
修改第十四行
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H fd:// --registry-mirror=https://rncxm540.mirror.a liyuncs.com --containerd=/run/containerd/containerd.sock
‘‘‘
[root@SR ~]# systemctl daemon-reload
[root@SR ~]# systemctl restart docker
# 默认会自动开启
[root@SR ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@SR ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@SR ~]# docker run -it centos:latest /bin/bash # 启动容器
[root@942ecb156f71 /]# cat /etc/redhat-release # 进入容器
CentOS Linux release 8.2.2004 (Core) # 查看结果
[root@942ecb156f71 /]# exit # 退出
?
[root@SR ~]# docker run -d centos:latest /bin/sh -c "while true;do echo hello world; sleep 1; done" # 使用-d配置在后台运行 一秒钟执行下hello world
745387d8b7382f3719d86ee0611af385a1a10ef5f86c86654f2a0bacfa02e49f # 生成一个唯一码
[root@SR ~]# docker logs 745387d8b7 # 查看输出 后面文件名可以不写全 唯一即可
hello world
hello world
hello world
hello world
[root@SR ~]# docker ps # 列出正在运行的
[root@SR ~]# docker ps -a # 列出所有的实例运行的以及停止运行的
[root@SR ~]# docker ps # 查看正在运行的容器
[root@SR ~]# docker kill fed9c2e02651 # 通过kill杀死容器ID
[root@SR ~]# docker stop f774400f0cdc
[root@SR ~]# docker restart f774400f0cdc # 根据容器ID
[root@SR ~]# docker ps
[root@SR ~]# docker ps -a # 查看所有运行的容器
[root@SR ~]# docker rm b51713e2edcc # 移除容器
# 保存 container 的当前状态到 image 后,然后生成对应的 image
[root@SR ~]# docker run -it centos:latest /bin/bash
[root@1d3563200044 /]# yum -y install httpd #在 container 中安装 apache 软件包
[root@1d3563200044 /]# exit
[root@SR ~]# docker commit 29c7d7d5b6bf centos:apache
sha256:ba0b5fcea42aaabd2f233df83d3b353ae5eee31e2e3e680ecc6b07649c6df751
[root@SR ~]# docker images
使用上述创建的镜像创建新的实例
[root@SR ~]# docker run -it centos:apache /bin/bash # 创建新的实例
[root@43a551dd9efc /]# rpm -qa httpd # 查看http
httpd-2.4.6-93.el7.centos.x86_64
[root@SR ~]# mkdir /docker-build
[root@SR ~]# cd /docker-build
[root@SR docker-build]# vim Dockerfile
FROM centos:7.6.1810 # 基于镜像
MAINTAINER <srcoder@163.com> # 创建者
RUN yum -y install httpd
ADD start.sh /usr/local/bin/start.sh #
CMD /usr/local/bin/start.sh # 开机启动
[root@SR docker-build]# echo "/usr/sbin/httpd -DFOREGROUND" > start.sh
[root@SR docker-build]# chmod a+x start.sh
[root@SR docker-bui]# docker build -t centos:http-v2 ./ # 创建镜像 -t:创建标记
[root@SR ~]# docker save -o docker-centos-httpd.tar centos:http-v2
[root@SR ~]# ll -h docker-centos-httpd.tar
上述打包的镜像内存过大
[root@SR ~]# docker save centos:httpd-v2 | gzip > docker-centos-httpd.tar.gz
[root@SR ~]# ll -h docker-centos-httpd.tar.gz
使用上述制作的镜像
[root@SR ~]# docker rmi centos:http-v2 # 删除本地有的防止冲突
[root@SR ~]# docker load -i docker-centos-httpd.tar # 加载本地
[root@SR ~]# docker run -d -p 80:80 centos:http-v2 # 将物理机的80与容器的80做映射
root@SR ~]# docker ps | grep 80 # 查看镜像
# 语法:docker exec -it <container id | name> /bin/bash
[root@SR ~]# docker exec -it 6f12cee2d136 /bin/bash
[root@6f12cee2d136 /]# echo "docker httpd test page" > /var/www/html/test.html # 添加测试
[root@6f12cee2d136 /]# yum install net-tools -y
[root@6f12cee2d136 /]# ifconfig | grep inet # 查看容器的IP
inet 172.17.0.5 netmask 255.255.0.0 broadcast 172.17.255.255
[root@SR ~]# ip addr | grep docker # 查看物理机的Docker的IP
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 # 通过该网卡上网 相当于NAT
原文:https://www.cnblogs.com/SR-Program/p/13838048.html