Docker基本使用方法
Docker#
简介#
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙盒机制,相互之间不会有任何接口(减少耦合)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包装系统
沙盒机制#
沙盒也叫沙箱,英文 sandbox。在计算机领域指一种虚拟技术,且多用于计算机安全技术。安全软件可以先让它在沙盒中运行,如果含有恶意行为,则禁止程序的进一步运行,而这不会对系统造成任何危害。
LXC#
LXC 为 Linux Container 的简写。Linux Container 容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性
Docker 是 dotCloud 公司开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于 go语言并遵从 Apache2.0 协议开源。
Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的 container 中,然后发布到任何流行的 Linux 机器上
Docker架构#
- Docker:码头工人
- Container:容器
工作流程:服务器 A 上运行 docker Engine 服务,在 docker Engine 上启动很多容器 container ,从外网 Docker Hub 上把 image 操作系统镜像下载来,放到 container 容器运行。这样一个容器的实例就运行起来了

Docker虚拟化#

PS:Docker相当于少了虚拟机这一层次 因此运行效率特别快 启动一个Docker实例1-2S即可
Docker特点#
- 文件系统隔离:每个容器运行在独立的根文件系统互不影响
- 资源隔离:每个容器可以分配不到的系统资源 例如:内存 CPU等
- 网络隔离:每个容器运行在自己的网络空间 虚拟接口和IP地址
- 日志记录:Docker会收集每个容器的输入输出日志用于实时检索或者批量检索
- 变更管理:容器文件系统的变更可以提交到新的镜像中,并可重复使用以创建更多的容器。无需使用模板或手动配置
- 交互式Shell:Docker 可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次交互 shell。
Docker使用#
安装#
# 安装依赖
[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
更改Docker默认镜像#
方法一#
[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
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 # 退出
启动docker常用参数
- -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
- -d: 后台运行容器,并返回容器ID;
- -i: 以交互模式运行容器,通常与 -t 同时使用;
- -P: 随机端口映射,容器内部端口随机映射到主机的端口
- -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
- -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
- --name="nginx-lb": 为容器指定一个名称;
- --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
- --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
- -h "mars": 指定容器的hostname;
- -e username="ritchie": 设置环境变量;
- --env-file=[]: 从指定文件读入环境变量;
- --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
- -m :设置容器使用内存最大值;
- --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
- --link=[]: 添加链接到另一个容器;
- --expose=[]: 开放一个端口或一组端口;
- --volume , -v: 绑定一个卷
Docker在后台运行#
[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 # 移除容器
Docker镜像制作与上传#
镜像制作#
- docker commit :保存 container 的当前状态到 image 后,然后生成对应的 image
- docker build :使用 Dockerfile 文件自动化制作 image
方法一#
# 保存 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
方法二#
- 使用 docker build 创建镜像时,需要使用 Dockerfile 文件自动化制作 image 镜像
- Dockerfile 有点像源码编译时./configure 后产生的 Makefile
[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
图解容器上网#
Docker容器命名#
方法#
方法一:--name#
# docker + --name 运行的容器
[root@SR ~]# docker run -it --name docker1 centos:7.6.1810 /bin/bash
方法二:--rename#
# docker + --rename 容器
[root@SR ~]# docker rename docker1 docker2
方法三:-h#
# -h配置centos主机名
[root@SR ~]# docker run -it --name docker5 -h test centos:http-v2 /bin/bash
[root@test /]# hostname
配置Docker开机启动#
# --restart=always 在容器退出时候总是启动容器
[root@SR ~]# docker run -it --restart=always --name test666 -h start centos:http-v2 /bin/bash
[root@start /]# hostname
开机启动其余参数
no:默认参数 容器退出时候不重启
on-failure:容器非正常状态退出重启容器
on-failure:3 容器非正常状态时候重启 最多重启三次
unless-stopped 在容器退出时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了的容器
# --update 修改服务开机重启
[root@SR ~]# docker run -itd --name=test888 centos:7.6.1810 /bin/bash
94d11f8c8e9500f79c0e66c70a9f4eae85faa768cf7c0fce61c37b7479e5ff39
[root@SR ~]# docker update --restart=always test888
test888
[root@SR ~]# systemctl stop docker
[root@SR ~]# systemctl start docker
[root@SR ~]# docker ps | grep test888
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
2019-10-19 DRF之视图家族