当前位置: 首页 > news >正文

Docker基础使用

Docker就是(程序+环境)包,解包到容器相互不影响。

docker官方以及大量的第三方制作了带各种程序的操作系统,装在名为image的文件中,存放在镜像仓库docker hub仓库。我们只需要输入命令找到这些image文件,然后创建一个容器实例化,那么已经配置好的程序就可以直接运行了。

这样节省了我们大量的部署配置运维的时间。解决了微服务的部署难题。

简单实战docker部署一个mysql

先给linux下载docker

【Docker】在 Ubuntu 上安装 Docker 的详细指南_ubuntu安装docker-CSDN博客

(使用ubuntu linux)

删除原有的docker

apt remove docker 

下载依赖

apt install apt-utils

apt install gnome-terminal

sudo apt install apt-transport-https ca-certificates curl software-properties-common

配置apt 国内源

根据下面的文章直接配置国内镜像源。

Ubuntu apt-get 国内镜像源替换(新手必看,超详细!各种镜像源网站都有)_apt 国内镜像-CSDN博客

配置docker的GPG秘钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

sudo apt-get update

sudo apt update

apt install docker-ce docker-ce-cli containerd.io

测试dokcer

docker -v

docker images

为了解析docker命令,需要启动docker守护进行服务。

ubuntu使用service命令启动服务,service 服务名 stop或者start或者restart

service docker start

配置docker的镜像加速

docker的镜像仓库在国外,那么docker需要配置镜像来加速下载的速度。

{
    "registry-mirrors": [
        "https://docker.linkedbus.com",
        "https://docker.xuanyuan.me"
    ]

Docker/DockerHub国内镜像源/加速列表(11月26日更新-长期维护)-CSDN博客

使用docker部署mysql

直接使用命令(\转义换行,使得单行命令可以多行输入)

docker run -d \
 --name mysql \
 -p 3306:3306 \
 -e TZ=Asia/Shanghai \
 -e MYSQL_ROOT_PASSWORD=123456 \
 mysql

如果想要使用已经有的images,通过docker images查看imagesID,使用下面的变量来创建实例。

docker run -e 环境变量 imagesID

例如:

docker run -e MYSQL_ROOT_PASSWORD=123456 5c62

5c62是具体的imageID。

注意:-p 的作用是将docker容器中的端口映射到宿主机的端口上,如果没有设置会导致外部无法连接。

这样在外部就可以连接到mysql实例了。

docker的基本机制

如果在上面使用docker安装mysql的时候遇到了问题,那么你一定会总结出如下的内容,没错这些内容都是在我安装mysql时出错,一点一点搜多理解出来的。

docker分为images镜像,container实例容器。(docker从docker官方维护的镜像仓库中下载image)

每个images是一个配好的程序,我们可以启动image从而得到一个实例,这个实例被叫做container,每个image可以有好多个实例,也就是好多个container。

通过docker run imageID 我们就可以得到container了。

通过docker ps -a 我们就可以看到所有的container了。没错ps还是那个ps,container分为正在运行的container和停止运行的container。

通过docker rm containerID来删除container,通过docker rmi imageID来删除image。

我们删除的时候需要将所有使用到images的container删除完毕才能删除image,否则可以使用级联强制删除images这样自动将所有用到image的container全删除了。

container容器实例

之所以叫做容器,是因为container是一个环境,包含了我们想要的程序。我们也可以进入容器。

进入容器内部:

docker exec -it containerID /bin/bash

可以知道exec是关键,表示进入容器重新运行一个什么什么。

-it选项是分别表示-t新的终端terminal以及-i允许与标准输入进行交互input

docker命令解析

docker run 创建并运行一个实例(容器)

众多选项解释:

--name 【xxx】 给容器起一个name(可以代替冗长的id)

-d 表示daemon让容器在后台运行不占用当前终端。

-p 【宿主机端口:容器端口】端口映射,将容器端口映射到宿主机端口上

-e 【key】=【value】是environment环境的缩写,环境变量。给容器内的实例读取的。可以从docker hub中查看镜像需要读取的环境变量。

[repository]:[tag]最后给镜像的名字,完整的写法就是镜像名:版本,如果没写版本就默认是最新版本。

docker常见命令

docker主线命令就是操作images和container的命令。我们根据这个流程,来熟悉一下docker的命令。


镜像操作

1 从镜像仓库中下载镜像到本地

docker pull,有点像git是吧,那么推送到镜像仓库自然而然就是docker push

2 查看本地镜像

docker images

3 删除镜像

docker rmi

构建自己的image

根据dockerFile文件,使用docker build来构建image

4 打包发送镜像

docker save 变成压缩包

5 压缩包加载到本地

docker load  


容器操作

1 下载镜像创建并运行容器

docker run

2 操作容器(中的程序)运行状态

docker stop/start/restart 【containerID】 

3 查看众多的容器状态

docker ps ,常用的有docker ps -a ,可以查看所有运行或者停止运行的容器,-all嘛。

为了简化输出信息,可以使用

docker ps --format "table {{.ID}}\t{{.Image }}\t{{ .Ports}}\t{{.Status}}\t{{.Names}}"

但是这串命令太长了,我们可以是使用linux的命令别名机制,来为这串命令起别名。

参见Linux不该忘记的知识-CSDN博客

4 删除容器实例

docker rm 【containerID】

5 查看容器运行的日志

docker logs

6 进入容器执行命令

docker exec ,常用的是docker exec -ti 创建新的终端并允许交互

b6c0cbb84e3d499587f7ba17d7185531.png

docker权限和安全

Docker真的需要root用户才能启动吗?揭秘非root权限运行Docker的秘诀! - 云原生实践

docker数据卷

某些镜像,我们需要修改容器内的数据。但是镜像通常只包括程序运行的基础环境。所以在容器内进行其他操作都是比较困难的。

所以出现了数据卷volume,实际上是将docker容器文件存储到了宿主机上。

还有一种是将容器数据存储在宿主机的内存中。

例如nginx容器

 docker部署nginx服务器,并修改静态网页,保持可以访问。

docker run -d --name nginx -p 80:80 nginx

 通过docker官网中对于nginx镜像的介绍,我们知道nginx镜像中配置静态网页的路径是/usr/share/nginx/html,nginx的配置文件在/etc/nginx/conf

映射规则

为了保证文件不冲突,宿主机上统一会把数据卷映射到/var/lib/docker/volumes/同名目录下。

(也可以指定目录,使用目录路径替代原数据卷的位置即可)

数据卷命令

创建docker volume create

指在当前宿主机上/var/lib/docker/volumes目录下创建一个数据卷,受到docker管理。下面的命令都是操作宿主机上的数据卷。

需要绑定操作才能将宿主机上的数据卷绑定到相应容器。

这个操作一般是通过docker run -v参数来实现

查看docker volume ls

删除docker volume rm

查看详细内容docker volume inspect

清除数据卷docker volume prune

docker volume --help实时查看帮助信息


要想让宿主机上的数据卷真正和docker容器中的目录建立联系,需要使用docker run -v

docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx

html表示数据卷名字,后面的路径是容器中的对应目录的路径。

这样名为html的数据卷就和nginx容器里的/usr/share/nginx/html目录绑定上了。

(如果数据卷不存在会自动在/var/lib/docker/volumes/下创建同名目录)


绑定之后通过docker volume inspect命令查看数据卷的信息。

可以看到html数据卷的详细信息。 

查看容器挂载的数据卷

docker inspect containerID或者name 查看容器详情。

命令的结果是一段json格式的输出,可以在Mounts属性下看到数据卷信息

匿名卷

在创建容器时自动创建的数据卷volume叫做匿名卷,是镜像中设定好的。

实际上是因为容器不再存在时,数据不会持续存在,并且如果另一个进程需要数据,则可能很难将数据从容器中取出。容器的可写层与运行容器的主机紧密耦合。您无法轻松地将数据移动到其他地方。

所以一些数据我们需要,创建数据卷将数据保存在宿主机上。

匿名卷的数据卷名称通常比较长,我们可以在docker run -v显式绑定数据卷,覆盖原本的匿名卷。

 覆盖之后,只要挂载到相同的地方,那么docker容器升级,或者删除了再部署,数据都会长久保存下来,还可以兼容使用。

dockerfile自定义镜像

我们自己开发的应用,也需要制作成镜像,来方便运维部署。

配置镜像就是配置程序运行所需要的每一层环境。

例如需要的linux系统,需要的jre环境,需要的jar包,需要的运行脚本。

docker将他们分为不同的层次,Layer。每层都有安装包依赖,配置等。

分层方便与修改,重组。所以有了一个概念BaseImage,基础镜像,通常就是系统函数库,环境配置,文件等等。众多的镜像都共用基础镜像,提速构建的过程。

在docker下载的时候也会检查镜像的层次,如果本地有镜像和要下载的镜像的基础镜像相同,那么就可以节省重复内容的下载时间,直接跳过开始下载镜像后面几层的内容。

dockerfile描述镜像结构

需要让docker帮助我们构建镜像。dockerfile就是我们描述镜像结构的工具。

dockerfile中主线指令如下:

from 指定基础镜像 例如 from centos:7.6

evn 设置容器中环境变量,也可后面指令中引用使用。env key=value

copy 将本地文件拷贝到镜像中的指定目录 copy  /export/server/jdk.tar.gz /tmp

run 让docker 容器执行命令 run tar -zxvf /tmp/jdk.tar.gz -C /export/server/ && EXPORTS path=/export/server/jdk:$path

expose 描述程序监听的端口,方便镜像使用者做端口映射 expose 8080

entrypoint 镜像中的启动命令,当容器启动的时候会调用这一条entrypoint ['java', '-jar' ,'xx.jar']

详细参考docker官方文档

构建镜像

写好dockerfile之后,使用docker build命令让docker构建镜像。

docker build -t 名字:版本 /dockerfile所在目录(-t就是tag版本的意思,如果不设置版本默认是latest)

 意思就是构建 版本为的镜像 根据 指定目录中的dockerfile

为什么指定的是dockerfile所在目录,是因为docker在解析和执行dockerfile中的命令时,dockerfile中会有一些copy等命令,这些命令所需要的资源文件往往放在dockerfile同目录下,所以直接指定目录是docker build的用法。

docker网络

docker中的所有容器都要自己的网络,通过docker inspect可以看到,这些容器都在同一个子网中。

docker有一个自己的虚拟网桥,docker启动的容器就桥接接在这个虚拟网桥上。

现在有的需求就是,要把某些容器的ip固定下来。

docker提供了建立docker局域网的操作。docker将容器名和容器的ip进行绑定,这样可以使用容器名来代替ip,那么无论ip如何动态分配都可以使用容器名来访问到容器。

docker network create

docker network ls,rm,prune,connect,disconnect,inspect这些命令都可以通过命令的字面意思进行理解。


可以在docker run 中直接指定network信息,这样容器就不会加入默认网桥中。

docker run --network networkname

容器只有在同一个子网中才能相互找到,ping


http://www.mrgr.cn/news/78838.html

相关文章:

  • Python办公自动化,批量生成Excel案例数据集
  • Linux下的三种 IO 复用
  • java数据库连接池
  • c++类和对象(2)
  • Flutter 1.1:下载Flutter环境
  • Oracle--表空间Tablespace
  • 【MySQL — 数据库基础】MySQL的安装与配置 & 数据库简单介绍
  • LearnOpenGL学习(光照 -- 颜色,基础光照,材质,光照贴图)
  • 数据结构之三:栈和队列
  • Web登录页面设计
  • 用go语言写一个小服务
  • 手机卡限速丨中国移动5G变3G,网速500kb
  • 单链表---移除链表元素
  • LearnOpenGL学习(光照 -- 颜色,基础光照,材质)
  • go使用mysql实现增删改查操作
  • 我们来学mysql -- 事务之概念(原理篇)
  • 深度学习 | pytorch + torchvision + python 版本对应及环境安装
  • spring boot3.3.5 logback-spring.xml 配置
  • create-vue创建vue3项目
  • 【2024】使用Docker搭建redis sentinel哨兵模式集群全流程(包含部署、测试、错误点指正以及直接部署)
  • dpwwn02靶场
  • uniapp手机端一些坑记录
  • 基于go语言探讨 Kubernetes 中 Rollout History 的实现与优化
  • Java启动通用参数,自动记录GC等信息到专门日志文件中
  • python学习笔记9-零散知识点
  • 微服务即时通讯系统的实现(服务端)----(2)