X
X
发布于 2023-12-09 / 87 阅读
0
0

安装Docker

背景

Docker是一个在Linux操作系统上运行的程序,它把运行环境应用程序打包在一起,消除了运行环境的差异对程序的影响。

基本概念

镜像(Image)

程序和程序依赖的所有内容打成一个包之后,我们就可以很方便的传输、保存、使用这个包,也就是docker的第一个概念:镜像(Image)。可以简单理解为一个压缩包,里面保存了你的程序想要运行所依赖的一切内容

仓库(Repository)

有很多别人已经打包好的镜像想要分享,于是docker官方找了个地方来保存这些镜像Image,方便大家使用,这个地方就叫仓库(Repository)

你可以通过docker pull xxx 命令从仓库(Repository)里下载你想要的镜像

也可以通过docker push xxx 命令把你的镜像上传到仓库(Repository)

容器(Container)

从仓库获取到镜像之后,你想要运行你的程序,这个时候就轮到容器(Container)出场了

镜像是一个文件压缩包,里面包含了程序和依赖的环境,程序运行起来才能叫容器

容器和镜像的关系简单类比:镜像就像一张图纸,容器就是你用图纸建出来的房子;只要材料足够,你可以用图纸建很多一样的房子

安装Docker

你可以参考官方安装方式:https://docs.docker.com/engine/install/

在Linux上我们一般只需要安装Docker Engine,即Docker引擎,然后通过命令行来操作Docker

在Windows上,可以参考 https://docs.docker.com/desktop/install/windows-install/

在Mac上,可以参考 https://docs.docker.com/desktop/install/mac-install/

一键安装Docker

以下我们以Linux举例。

非生产环境,为了简化Docker安装过程,我们可以使用官方脚本,一键安装Docker,脚本会自己判断Linux版本,自动下载安装最新的Docker Engine

可以加 --version <VERSION> 来指定安装版本 比如 --version 23.0,不加默认最新版本

可以加 --channel <stable|test> 来指定stable 还是test,不加默认stable

可以加 --mirror <Aliyun|AzureChinaCloud> 来指定下载镜像,不加默认Docker官方路径

# 国内环境 使用aliyun加速镜像
[duoduo@4c8g12m ~]$ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

# 如果是国外的服务器 可以直接安装 无需加镜像地址
[duoduo@4c8g12m ~]$ curl -sSL https://get.docker.com/ | sh

# 启动docker
[duoduo@4c8g12m ~]$ sudo systemctl start docker

# 设置开机自动启动
[duoduo@4c8g12m ~]$ sudo systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

# 查看docker版本 我安装的时候最新版本是24.0.7
[duoduo@4c8g12m ~]$ docker -v
Docker version 24.0.7, build afdd53b

用户添加到Docker组

当我通过docker ps命令查看所有我运行的容器时,发现权限不足,需要加sudo

[duoduo@4c8g12m ~]$ docker ps
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied

为了避免每次执行docker命令都要加sudo,可以把当前用户添加到docker组

# 添加docker组,一般安装完Docker,系统会自动创建docker组,所以这里可能会提示: "docker"组已存在
[duoduo@4c8g12m ~]$ sudo groupadd docker

# 添加当前用户到docker组
[duoduo@4c8g12m ~]$ sudo gpasswd -a ${USER} docker
正在将用户“duoduo”加入到“docker”组中

# 重启docker生效
[duoduo@4c8g12m ~]$ sudo systemctl restart docker

#重新登录之后,用户可以不用加sudo,即可执行docker命令
[duoduo@4c8g12m ~]$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[duoduo@4c8g12m ~]$

Hello World

运行的hello-word程序Docker版

# 拉取hello-world的最新镜像

[duoduo@4c8g12m ~]$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
719385e32844: Pull complete
Digest: sha256:c79d06dfdfd3d3eb04cafd0dc2bacab0992ebc243e083cabe208bac4dd7759e0
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

# 运行hello-world容器
[duoduo@4c8g12m ~]$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

......

镜像加速

由于国内连接docker的官方服务器比较慢,一般我们会配置国内公司提供的镜像服务器,加快下载镜像的速度。

国内常用加速器有:

* 阿里云加速器 https://*****.mirror.aliyuncs.com

* 网易云加速器 https://hub-mirror.c.163.com

* 百度云加速器 https://mirror.baidubce.com

以阿里云加速器为例:找到容器镜像服务->镜像工具->镜像加速器->复制加速器地址

然后编辑或创建/etc/docker/daemon.json文件,重启docker

[duoduo@4c8g12m ~]$ vim /etc/docker/daemon.json 

{
    "registry-mirrors": ["https://****.mirror.aliyuncs.com"]
}
[duoduo@4c8g12m ~]$ sudo systemctl daemon-reload
[duoduo@4c8g12m ~]$ sudo systemctl restart docker

# 查看是否生效
[duoduo@4c8g12m ~]$  docker info

# 最下面会有这两行
 Registry Mirrors:
  https://*****.mirror.aliyuncs.com/

docker run 命令

最开始你只需要学会一条命令即可 docker run

# 运行一个Nginx服务器
[duoduo@4c8g12m ~]$ docker run -d -p8080:80 nginx

然后通过浏览器访问 http://你的IP:8080, 就能看到熟悉的Nginx欢迎画面

解释下 docker run的语法

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

  • OPTIONS:可选参数,用于配置容器的各种属性。

  • IMAGE:必需参数,指定要运行的容器镜像。

  • COMMAND:可选参数,覆盖容器中定义的默认命令。

  • ARG...:可选参数,传递给容器中的命令的参数。

这里的OPTIONS 我们常用的主要有3个参数

docker run -p

docker run -p 主机端口:容器端口

p 是port的缩写,即代表端口。比如Nginx的默认端口是80,如果我们想通过宿主机的80端口访问容器里的80端口,那就需要设置端口映射。

如果有多个端口,可以设置多个-p 参数

docker run -d

d是detach的缩写,表示在后台以守护进程的方式运行。这样可以避免当控制台关闭的时候,影响程序运行

docker run -v

docker run -v 主机路径:容器路径

v是volume的缩写,主要是为了防止容器删除的时候,数据丢失。

所以把数据保存到容器外面,容器映射数据路径即可

# 创建一个nginx的容器,获取配置项
[duoduo@4c8g12m ~]$ docker run -d --name mynginx nginx
8bf2b396f120e59761d7da66e6cfaf8bba1c2bf2aa9d03cff9d894fe7816baec

# 创建一个本地映射目录nginx
[duoduo@4c8g12m ~]$ mkdir nginx

# 拷贝容器中的配置项到本地
[duoduo@4c8g12m ~]$ docker cp mynginx:/etc/nginx/nginx.conf nginx/
Successfully copied 2.56kB to /home/duoduo/nginx/
[duoduo@4c8g12m ~]$ docker cp mynginx:/usr/share/nginx/html nginx/
Successfully copied 4.1kB to /home/duoduo/nginx/
[duoduo@4c8g12m ~]$ docker cp mynginx:/etc/nginx/conf.d nginx/
Successfully copied 3.58kB to /home/duoduo/nginx/

# 关闭原有nginx容器,删除nginx容器
[duoduo@4c8g12m nginx]$ docker stop mynginx
8bf2b396f120
[duoduo@4c8g12m nginx]$ docker rm mynginx
8bf2b396f120

# 使用本地的配置项,创建一个nginx容器
[duoduo@4c8g12m ~]$ docker run --name mynginx \
-e TZ="Asia/Shanghai" \
-d -p 80:80 -p 443:443 \
-v ./nginx/html:/usr/share/nginx/html \
-v ./nginx/nginx.conf:/etc/nginx/nginx.conf \
-v ./nginx/logs:/var/log/nginx \
-v ./nginx/conf.d:/etc/nginx/conf.d \
nginx:latest


评论