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使用

安装

# 安装依赖
[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镜像制作与上传

镜像制作

  1. docker commit :保存 container 的当前状态到 image 后,然后生成对应的 image
  2. 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

方法二

  1. 使用 docker build 创建镜像时,需要使用 Dockerfile 文件自动化制作 image 镜像
  2. 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

posted @ 2020-10-19 00:40  SR丶  阅读(1372)  评论(0编辑  收藏  举报