Docker基本使用方法

Docker#

简介#

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙盒机制,相互之间不会有任何接口(减少耦合)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包装系统

docker官网

沙盒机制#

沙盒也叫沙箱,英文 sandbox。在计算机领域指一种虚拟技术,且多用于计算机安全技术。安全软件可以先让它在沙盒中运行,如果含有恶意行为,则禁止程序的进一步运行,而这不会对系统造成任何危害。

LXC#

LXC 为 Linux Container 的简写。Linux Container 容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性

Docker 是 dotCloud 公司开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于 go语言并遵从 Apache2.0 协议开源。

Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的 container 中,然后发布到任何流行的 Linux 机器上

Docker架构#

  1. Docker:码头工人
  2. Container:容器

工作流程:服务器 A 上运行 docker Engine 服务,在 docker Engine 上启动很多容器 container ,从外网 Docker Hub 上把 image 操作系统镜像下载来,放到 container 容器运行。这样一个容器的实例就运行起来了

Docker虚拟化#

PS:Docker相当于少了虚拟机这一层次 因此运行效率特别快 启动一个Docker实例1-2S即可

Docker特点#

  1. 文件系统隔离:每个容器运行在独立的根文件系统互不影响
  2. 资源隔离:每个容器可以分配不到的系统资源 例如:内存 CPU等
  3. 网络隔离:每个容器运行在自己的网络空间 虚拟接口和IP地址
  4. 日志记录:Docker会收集每个容器的输入输出日志用于实时检索或者批量检索
  5. 变更管理:容器文件系统的变更可以提交到新的镜像中,并可重复使用以创建更多的容器。无需使用模板或手动配置
  6. 交互式Shell:Docker 可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次交互 shell。

Docker使用#

安装#

Copy
# 安装依赖 [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

镜像拉取#

方法一:默认源下载#

Copy
[root@SR ~]# docker search centos # 查看镜像 [root@SR ~]# docker pull centos # 拉取镜像 因为服务器在国外可能会拉取失败 [root@SR ~]# docker images # 查看拉取的镜像

方法二:指定源下载#

Copy
[root@SR ~]# docker pull hub.c.163.com/library/tomcat:latest # 指定镜像源下载 [root@SR ~]# docker images # 查看拉取的镜像

方法三:加载本地镜像#

Copy
[root@SR ~]# docker load -i docker-centos7.tar

更改Docker默认镜像#

方法一#

Copy
[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

方法二#

Copy
# 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常用命令#

配置网络转发#

Copy
# 默认会自动开启 [root@SR ~]# vim /etc/sysctl.conf net.ipv4.ip_forward = 1 [root@SR ~]# sysctl -p net.ipv4.ip_forward = 1

启动容器#

Copy
[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在后台运行#

Copy
[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

查看正在运行的容器#

Copy
[root@SR ~]# docker ps # 列出正在运行的 [root@SR ~]# docker ps -a # 列出所有的实例运行的以及停止运行的

关闭容器#

Copy
[root@SR ~]# docker ps # 查看正在运行的容器 [root@SR ~]# docker kill fed9c2e02651 # 通过kill杀死容器ID [root@SR ~]# docker stop f774400f0cdc

重启容器#

Copy
[root@SR ~]# docker restart f774400f0cdc # 根据容器ID\ [root@SR ~]# docker ps

删除容器#

Copy
[root@SR ~]# docker ps -a # 查看所有运行的容器 [root@SR ~]# docker rm b51713e2edcc # 移除容器

Docker镜像制作与上传#

镜像制作#

  1. docker commit :保存 container 的当前状态到 image 后,然后生成对应的 image
  2. docker build :使用 Dockerfile 文件自动化制作 image

方法一#

Copy
# 保存 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

使用上述创建的镜像创建新的实例

Copy
[root@SR ~]# docker run -it centos:apache /bin/bash # 创建新的实例 [root@43a551dd9efc /]# rpm -qa httpd # 查看http httpd-2.4.6-93.el7.centos.x86_64

方法二#

  1. 使用 docker build 创建镜像时,需要使用 Dockerfile 文件自动化制作 image 镜像
  2. Dockerfile 有点像源码编译时./configure 后产生的 Makefile
Copy
[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:创建标记

镜像发布#

方法一#

Copy
[root@SR ~]# docker save -o docker-centos-httpd.tar centos:http-v2 [root@SR ~]# ll -h docker-centos-httpd.tar

上述打包的镜像内存过大

Copy
[root@SR ~]# docker save centos:httpd-v2 | gzip > docker-centos-httpd.tar.gz [root@SR ~]# ll -h docker-centos-httpd.tar.gz

使用上述制作的镜像

Copy
[root@SR ~]# docker rmi centos:http-v2 # 删除本地有的防止冲突 [root@SR ~]# docker load -i docker-centos-httpd.tar # 加载本地

配置容器映射#

启动容器#

Copy
[root@SR ~]# docker run -d -p 80:80 centos:http-v2 # 将物理机的80与容器的80做映射 root@SR ~]# docker ps | grep 80 # 查看镜像

访问容器#

Copy
# 语法: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 # 添加测试

容器网络#

Copy
[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#

Copy
# docker + --name 运行的容器 [root@SR ~]# docker run -it --name docker1 centos:7.6.1810 /bin/bash

方法二:--rename#

Copy
# docker + --rename 容器 [root@SR ~]# docker rename docker1 docker2

方法三:-h#

Copy
# -h配置centos主机名 [root@SR ~]# docker run -it --name docker5 -h test centos:http-v2 /bin/bash [root@test /]# hostname

配置Docker开机启动#

Copy
# --restart=always 在容器退出时候总是启动容器 [root@SR ~]# docker run -it --restart=always --name test666 -h start centos:http-v2 /bin/bash [root@start /]# hostname
开机启动其余参数
Copy
no:默认参数 容器退出时候不重启 on-failure:容器非正常状态退出重启容器 on-failure:3 容器非正常状态时候重启 最多重启三次 unless-stopped 在容器退出时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了的容器
Copy
# --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

posted @   SR丶  阅读(1457)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
历史上的今天:
2019-10-19 DRF之视图家族
点击右上角即可分享
微信分享提示
CONTENTS