草庐IT

Docker

小默有礼 2024-01-26 原文

1、Docker简介


官网的介绍是“Docker is the world’s leading software container platform.”官方给Docker的定位是一个应用容器平台。
Docker通俗的讲是服务器中高性能的虚拟机,可以将一台物理机虚拟N多台虚拟机的机器,互相之间隔离,互不影响。

容器和虚拟机比较

特性容器虚拟机
启动秒级分钟级
硬盘使用一般为MB一般为GB
性能接近原生硬件弱鸡
系统支持量单机可跑几十个容器单机几个虚拟OS
运行环境主要在Linux主要在window

相同:容器和虚拟机都是虚拟化技术,具备资源隔离和分配优势
不同:
- Docker虚拟化的是操作系统,虚拟机虚拟化的是硬件
- 传统虚拟机可以运行不同的操作系统,Docker主要运行同一类操作系统(Linux)

Docker的基本概念
宿主机: 安装Docker守护进程的Linux服务器,称之为宿主机;
镜像(Image): Docker 镜像,就相当于是一个 root 文件系统。除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数。
容器(Container): 镜像运行之后的实体,镜像和容器的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository): 仓库可看成一个镜像控制中心,用来保存镜像。

2、Docker安装与启动

1、查看电脑上是否已经安装Docker

yum list installed | grep docker

2、安装docker

yum -y install docker

3、查看安装版本

docker -v

4、启动docker

systemctl命令是系统服务管理器指令

systemctl start docker

5、停止docker

systemctl stop docker

6、重启docker

systemctl restart docker

7、查看docker状态

systemctl status docker

8、开启自启

systemctl enable docker

9、查看docker概要信息

docker info


10、镜像加速
默认情况,将从docker hub(https://hub.docker.com/)下载docker镜像太慢,一般都会配置镜像加速器,这里有两种国内镜像可以提供:
编辑docker下的daemon.json文件

vim /etc/docker/daemon.json

在该文件中输入如下内容:

中科大

{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] 
}

阿里云

{ 
"registry-mirrors": ["https://3ad96kxd.mirror.aliyuncs.com"] 
}

3、Docker常用命令

1、镜像相关

查看镜像

docker images

搜索镜像

docker search 镜像名称

拉取镜像

docker pull 镜像名称:版本

删除镜像

docker rmi 镜像id

删除之前要确认此镜像已经没有被容器在使用,如果存在正在运行的docker容器,删除会报错 “Error: container_delete: Impossible to remove a running container, please stop it first”
批量删除镜像

docker rmi `docker images -q`

2、容器相关

查看正在运行的容器

docker ps

查看所有容器(查看正在运行的和已经停止运行的)

docker ps –a

查看最后一次运行的容器

docker ps –l

查看停止的容器

docker ps -f status=exited

3、创建和启动容器

创建容器命令:

docker run 参数 镜像名称:镜像标签 /bin/bash

创建容器常用的参数说明:

命令参数详解
-i:表示运行容器,如果不加该参数那么只是通过镜像创建容器,而不启动。
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端(如果 只加it两个参数,创建后就会自动进去容器)。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)。
–name :为创建的容器命名。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录 或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射,例如: 可以将Docker中Tomcat容器的8080端口映射到宿主机上的某一个端口8080,那么以后访问tomcat只需 要:http://宿主机的IP:8080/
进入容器之后,初始化执行的命令:/bin/bash;可写可不写

交互式容器
使用交互式运行容器,容器运行后直接进入到容器内部,退出容器内部后,容器直接关闭只有第一次才会这样,以后再启动容器就是一个守护式的。

docker run -it --name=容器名称 镜像名称:标签	/bin/bash

退出当前容器

exit

守护式容器

docker run -di --name=容器名称  镜像名称:标签	/bin/bash

登录容器/进入容器的目录

docker exec -it 容器名称(或容器id) /bin/bash

注:这里的登陆容器之后执行的脚本/bin/bash必须写
停止容器

docker stop 容器名称(容器id)

启动容器

docker start 容器名称(容器id)

文件拷贝
将宿主机的文件拷贝到容器内可以使用cp命令

docker cp 需要拷贝的文件或目录	容器名称:容器目录

也可以将文件从容器内拷贝出来

docker cp 容器名称:容器目录	需要拷贝的文件或目录

目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。

docker run -di -v 宿主机目录:容器目录

查看容器ip

docker inspect 容器名称(容器id)

删除容器

docker rm 容器名称(容器id)

4、Docker数据卷

数据卷是宿主机中的一个目录或文件,当容器目录和数据卷目录绑定后,对方的修改会立即同步。一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷。
简单来说数据卷本质其实是共享文件夹,是宿主机与容器间数据共享的桥梁。
作用

  1. 容器数据持久化
  2. 外部机器和容器间接通信
  3. 容器之间数据交换

1、1个容器挂载1个数据卷

创建启动容器时,使用 –v 参数 设置数据卷

docker run ... -v 宿主机目录:容器内目录

注意事项:

  1. 目录必须是绝对路径
  2. 如果宿主机目录不存在,会自动创建
  3. 可以挂载多个数据卷

例:

#拉取centos镜像 
docker pull centos:7 
#安装启动容器并挂载 
docker run -di --name=c1 -v /root/host_data1:/root/c1_data centos:7 /bin/bash
#查看容器已挂在的数据卷
docker inspect 容器名称(容器id)

2、1个容器挂载多个数据卷

docker run -di --name=c1 -v /root/host_data1:/root/c1_data1 -v /root/host_data2:/root/c1_data2 centos:7 /bin/bash

3、多个容器挂载1个数据卷

docker run -di --name=c2 -v /root/host_data_common:/root/c2_data centos:7 
docker run -di --name=c3 -v /root/host_data_common:/root/c3_data centos:7

4、多个容器挂载1个容器

##创建启动c3数据卷容器,使用 –v 参数 设置数据卷 
docker run -di --name=c3 -v /root/host_data_common:/root/c3_data centos:7 /bin/bash 
##创建启动 c1 c2 容器,使用 –-volumes-from 参数 设置数据卷 
docker run -di --name=c1 --volumes-from c3 centos:7 /bin/bash 
docker run -di --name=c2 --volumes-from c3 centos:7 /bin/bash

5、在Docker中部署软件

1、MySQL部署

## 搜索mysql镜像
docker search mysql
## 拉取mysql镜像
docker pull mysql:5.7
## 创建容器、设置端口映射、目录挂载、设置mysql初始密码
docker run -di --name=mysql -p 3307:3306 -v root/mysql/logs:/logs -e MYSQL_ROOT_PASSWORD = 123456
mysql:5.7
## 进入容器、操作mysql
docker exec -it mysql /bin/bash

然后就可以通过数据库连接软件进行连接了,注意端口号是3307

2、tomcat部署

## 搜索tomcat镜像
docker search tomcat
## 拉取tomcat镜像
docker pull tomcat:8
## 创建容器,设置端口映射、目录映射
docker run -di --name=mytomcat -p 8080:8080 -v /root/tomcat/webapps:/usr/local/tomcat/webapps tomcat:8

然后使用外部机器访问Tomcat,测试部署服务

3、Nginx部署

## 搜索Nginx镜像
docker search Nginx
## 拉取Nginx镜像
docker run -di --name=mynginx -p 80:80 nginx

测试访问即可

4、Redis部署

##  搜索redis镜像
docker search redis
##  拉取redis镜像
docker pull redis
##  创建容器,设置端口映射
docker run -id --name=c_redis -p 6379:6379 redis

使用外部机器连接redis,测试

6、镜像备份

容器保存为镜像

docker commit {正在运行容器名称/容器ID} {镜像名称}:{镜像标签}

镜像备份

docker save -o {压缩包存放路径} {镜像名称/镜像ID} 
# 举例 
docker save -o redis.tar redis:version_lagou_1.0.0 
#压缩包在生产环境下会还原为一个 image,还原之后的name和tag 
# -o :输出到的文件

镜像恢复

## 恢复镜像
docker load -i {备份的镜像文件}

有关Docker的更多相关文章

  1. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  2. ruby-on-rails - 私有(private) gem 没有安装在 docker 中 - 2

    我正在尝试使用docker运行一个Rails应用程序。通过github的sshurl安装的gem很少,如下所示:Gemfilegem'swagger-docs',:git=>'git@github.com:xyz/swagger-docs.git',:branch=>'my_branch'我在docker中添加了keys,它能够克隆所需的repo并从git安装gem。DockerfileRUNmkdir-p/root/.sshCOPY./id_rsa/root/.ssh/id_rsaRUNchmod700/root/.ssh/id_rsaRUNssh-keygen-f/root/.ss

  3. ruby-on-rails - 将 Heroku 环境变量传输到 Docker 实例 - 2

    我在Heroku上构建了一个必须在Docker容器内运行的RoR应用程序。为此,我使用officialDockerfile.因为它在Heroku中很常见,所以我需要一些附加组件才能使这个应用程序完全运行。在生产中,变量DATABASE_URL在我的应用程序中可用。但是,如果我尝试其他一些使用环境变量(在我的例子中是Mailtrap)的加载项,变量不会在运行时复制到实例中。所以我的问题很简单:如何让docker实例在Heroku上执行时知道环境变量?您可能会问,我已经知道我们可以在docker-compose.yml中指定一个environment指令。我想避免这种情况,以便能够通过项目

  4. ruby - 更新 gem 时 Docker 包安装缓存问题 - 2

    我在开发和生产中都使用docker,真正困扰我的一件事是docker缓存的简单性。我的ruby​​应用程序需要bundleinstall来安装依赖项,因此我从以下Dockerfile开始:添加GemfileGemfile添加Gemfile.lockGemfile.lock运行bundleinstall--path/root/bundle所有依赖项都被缓存,并且在我添加新gem之前效果很好。即使我添加的gem只有0.5MB,从头开始安装所有应用程序gem仍然需要10-15分钟。由于依赖项文件夹的大小(大约300MB),然后再花10分钟来部署它。我在node_modules和npm上遇到了

  5. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  6. 转转测试环境docker化实践 - 2

        测试环境对于任何一个软件公司来讲,都是核心基础组件之一。转转的测试环境伴随着转转的发展也从单一的几套环境发展成现在的任意的docker动态环境+docker稳定环境环境体系。期间环境系统不断的演进,去适应转转集群扩张、新业务的扩展,走了一些弯路,但最终我们将系统升级到了我们认为的终极方案。下面我们介绍一下转转环境的演进和最终的解决方案。1测试环境演进1.1单体环境    转转在2017年成立之初,5台64G内存的机器,搭建5个完整的测试环境。就满足了转转的日常所需。一台分给开发,几台分给测试。通过沟通协调就能解决多分支并行开发下冲突问题。1.2动态环境+稳定环境    随着微服务化的进

  7. Docker启动故障问题 no such file or directory解决方法 - 2

    1.现象服务重启后,通过dockerstart方式无法启动实例,报出错误:Errorresponsefromdaemon:errorcreatingoverlaymountto/var/lib/docker/overlay2/xxx/merged:nosuchfileordirectorydockersave导出镜像也报出2.网上各种尝试摸索无效果修改daemon.json中的storage-driver为overlay,重启无效果。禁用selinux,临时或永久方式都无效果。修改/etc/docker/daemon.json中的storage-driver为overlay2,无效果。修改/l

  8. Docker+HomeAssistant+HACS+设备接入教程 - 2

    homeassistant久仰大名,据说可以一统各大物联网平台的设备,家里各平台的设备都有一点,控制起来很不方便,于是乎我也来尝尝~homeassistant官网https://www.home-assistant.io/HACShttps://github.com/hacs/integration准备1.Linux系统(Window)其实也类似2.安装好dockerdocker安装homeassistant官方有几个版本可供选择,安装方式可以:直接刷HA的系统,也可以用Docker安装,还可以直接安装在物理机上,具体区别如下:我采用的是Docker进行安装,也就是Container,从上图也

  9. 使用软连接的方式修改Docker数据存储目录 - 2

    文章目录前言一、迁移步骤前言Docker安装的东西多了或者目录分配大小未提前规划好,就容易出现磁盘空间不足的问题,可以采用软链接的方式迁移数据目录空间。一、迁移步骤要使用软连接的方式修改Docker数据存储目录,需要执行以下步骤:1、使用systemctlstopdocker命令停止Docker服务;2、创建文件夹:mkdir/home/docker(/home/docker为新磁盘目录名);3、移动/var/lib/docker/目录到新目录中:mv/var/lib/docker/*/home/docker;4、使用rm-rf/var/lib/docker命令删除原有的Docker数据目录;

  10. Ubuntu20.04安装Docker - 2

    一、Docker介绍Docker中⽂社区⽂档:https://www.docker.org.cn/index.html  Docker是⼀个开源的软件部署解决⽅案。  Docker也是轻量级的应⽤容器框架。  Docker可以打包、发布、运⾏任何的应⽤。  Docker就像⼀个盒⼦,⾥⾯可以装很多物件,如果需要某些物件,可以直接将该盒⼦拿⾛,⽽不需要从该盒⼦中⼀件⼀件的取。  Docker是⼀个客户端-服务端(C/S)架构程序。客户端只需要向服务端发出请求,服务端处理完请求后会返回结果。Docker包括三个基本概念:镜像(Image)  Docker的镜像概念类似于虚拟机⾥的镜像,是⼀个只读的

随机推荐