docker 安装与使用

0 docker 出现的原因

软件在开发机器上可以跑,但是在其他机器上,无法跑,或者其他机器需要繁琐的环境配置。在另外的机器上能跑,必须保证:

  • 操作系统的设置

  • 各种库和组件的安装

    从根本上解决问题,软件带环境安装,安装的时候,把原始环境一模一样地复制过来。

  • 虚拟机是带环境安装的一种方法,但是主要有这样的几个缺点:

    • 资源占用多,虚拟机本身会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。
    • 冗余步骤多,虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。
    • 启动慢,启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。
  • linux 容器(Linux Containers,缩写为 LXC)

    • Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。由于容器是进程级别的,相比虚拟机有很多优势。

      • 启动快,容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。
      • 资源占用少,容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。
      • 体积小,容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。

      容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。

  • docker, Linux 容器的一种封装,提供简单易用的容器使用接口

    • Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。

docker 目前主要用于提供一次性环境提供弹性的云服务组建微服务架构

1 安装 docker

1.1 docker 的构成
  • 镜像(Image):

    docker镜像类似一个模板,可以通过这个模板来创建容器服务,tomcat镜像 --> run --> tomcat01容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。

  • 容器(container):

    docker利用容器技术,独立运行一个或者一组应用通过镜像来创建,可以暂且把这个容器理解为就是一个简易的linux系统

  • 仓库(repository):

    仓库就是存放镜像(image)的地方,可以分为公有仓库和私有仓库。

1.2 安装 docker
  • linux 内核要求在 3.0 以上,查看环境信息:
bash 复制代码
uname -r 
# 4.15.0-192-generic

cat /etc/os-release
# NAME="Ubuntu"
# VERSION="18.04.6 LTS (Bionic Beaver)"
# ID=ubuntu
# ID_LIKE=debian
# PRETTY_NAME="Ubuntu 18.04.6 LTS"
# VERSION_ID="18.04"
# HOME_URL="https://www.ubuntu.com/"
# SUPPORT_URL="https://help.ubuntu.com/"
# BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
# PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
# VERSION_CODENAME=bionic
# UBUNTU_CODENAME=bionic
  • 安装 docker
bash 复制代码
# 卸载旧版本
sudo apt remove \
  docker-client \
  docker-client-latest \
  docker-common \
  docker-latest \
  docker-latest-logrotate \
  docker-logrotate \
  docker-engine

# 安装容器之前,更新软件包索引。
sudo apt-get update && sudo apt-get upgrade

# 安装Docker的依赖包
sudo apt install apt-transport-https ca-certificates curl software-properties-common

# 设置使用国内的镜像仓库
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["xxx"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker


# 安装容器相关的 docker-ce(社区版)docker-ee(企业版)
sudo apt install docker-ce docker-ce-cli containerd.io

# 启动docker
sudo systemctl start docker

# Docker 需要用户具有 sudo 权限,为了避免每次命令都输入sudo,可以把用户加入 Docker 用户组
sudo usermod -aG docker $USER

# 查看是否安装成功
docker version

# 测试 hello-world
docker run hello-world

# 查看下载的这个hello-world镜像
docker images

# 卸载docker
# 卸载依赖
apt remove docker-ce docker-ce-cli containerd.io
# 删除资源
rm -rf /var/lib/docker
# /var/lib/docker 是docker的默认工作路径

2 docker 常用命令

2.1 帮助命令
2.2 镜像命令
  • docker images 查看所有本地主机上的镜像 可以使用docker image ls代替
  • docker search 搜索镜像
  • docker pull 下载镜像 docker image pull
  • docker rmi 删除镜像 docker image rm
    使用说明:
bash 复制代码
docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d1165f221234   4 months ago   13.3kB
# 解释
REPOSITORY   镜像的仓库源
TAG          镜像的标签
IMAGE ID     镜像的ID
CREATED      镜像的创建时间
SIZE         镜像的大小
# 可选项
  -a, --all             # 列出所有的镜像
  -q, --quiet           # 只显示镜像的id
docker images -aq #显示所有镜像的id

docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation...   11138     [OK]       
mariadb                           MariaDB Server is a high performing open sou...   4221      [OK]       
mysql/mysql-server                Optimized MySQL Server Docker images. Create...   829                  [OK]
percona                           Percona Server is a fork of the MySQL relati...   547       [OK]       
phpmyadmin                        phpMyAdmin - A web interface for MySQL and M...   274       [OK]       
centos/mysql-57-centos7           MySQL 5.7 SQL database server                   89                   
mysql/mysql-cluster               Experimental MySQL Cluster Docker images. Cr...   88   
# 可选项
--filter=STARS=3000   # 搜索出来的镜像就死starts 大于3000的
# docker search mysql --filter=STARS=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation...   11138     [OK]       
mariadb   MariaDB Server is a high performing open sou...   4221      [OK]

docker pull 下载镜像
# 下载镜像 docker pull 镜像名[:tag]
docker pull mysql
# 等价于
docker pull docker.io/library/mysql:latest
# 指定版本下载
docker pull mysql:5.7

docker rmi 删除镜像
docker rmi -f 镜像id         # 删除指定的镜像
docker rmi -f 镜像id 镜像id 镜像id 镜像id   # 删除多个镜像
docker rmi -f $(docker images -aq)     # 删除全部的镜像
2.3、容器命令
  • docker run 镜像id 新建容器并启动
  • docker ps 列出所有运行的容器 docker container list
  • docker rm 容器id 删除指定容器
  • docker start 容器id 启动容器
  • docker restart容器id #重启容器
  • docker stop 容器id #停止当前正在运行的容器
  • docker kill 容器id #强制停止当前容器

下面拉取一个 centos 的镜像试验一下:

bash 复制代码
# 拉取镜像
docker pull centos
# Using default tag: latest
# latest: Pulling from library/centos
# a1d0c7532777: Pull complete
# Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
# Status: Downloaded newer image for centos:latest
# docker.io/library/centos:latest


# 新建容器并启动
docker run [可选参数] image
# 参数说明
# --name="Name"     容器名字   tomcat01   tomcat02,  用来区分容器
# -d                后台方式运行
# -it               使用交互方式运行,进入容器查看内容
# -p                指定容器的端口 -p  8080:8080
#     -p   ip:主机端口:容器端口
#     -p   主机端口:容器端口(常用)
#     -p   容器端口
#     容器端口
# -p                随机指定端口
docker run -it centos /bin/bash
# runc: symbol lookup error: runc: undefined symbol: seccomp_api_get
# docker: Error response from daemon: cannot start a stopped process: unknown.
# 直接运行的时候,有时候可能会出现错误,此时需要新增一下依赖即可。
yum install libseccomp-devel
# 然后重新运行
# 测试,启动并进入容器
此时主机名称发生了一些变化,新的这个主机名称,也就是我们的镜像的id
# 从容器中退回主机
exit

# 列出所有的运行的容器
docker ps #列出当前正在运行的容器
    -a  # 列出当前正在运行的容器+带出历史运行过的容器
    -n=? # 显示最近创建的容器
    -q  # 只显示容器的编号


# 退出容器
exit    # 直接容器停止并退出
Ctrl + P + Q # 容器不停止退出,退出了容器,但是容器还是在后台运行的


# 删除容器
docker rm 容器id     # 删除指定容器,不能删除正在运行的容器,如果要强制删除  rm -f
docker rm -f $(docker ps -aq)  # 删除所有的容器
docker ps -a -q | xargs docker rm  # 删除所有的容器


# 启动和停止容器的操作
docker start 容器id     #启动容器
docker restart 容器id  #重启容器
docker stop 容器id      #停止当前正在运行的容器
docker kill 容器id      #强制停止当前容器
2.4、常用其他命令
2.4.1 后台启动容器:
  • docker run -d 镜像名
    • 常见的坑,docker 容器使用后台运行,就必须要有一个前台进程, docker 发现没有应用,就会自动停止
    • nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
2.4.2 查看日志
  • docker logs --help
bash 复制代码
Usage:  docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

Aliases:
  docker container logs, docker logs

Options:
      --details        Show extra details provided to logs
  -f, --follow         Follow log output
      --since string   Show logs since timestamp (e.g. "2013-01-02T13:23:37Z") or relative (e.g. "42m" for 42 minutes)
  -n, --tail string    Number of lines to show from the end of the logs (default "all")
  -t, --timestamps     Show timestamps
      --until string   Show logs before a timestamp (e.g. "2013-01-02T13:23:37Z") or relative (e.g. "42m" for 42 minutes)
2.4.3 查看容器中进程信息
  • docker top 容器id
2.4.4 查看镜像的元数据
  • docker inspect 容器id

具体的去了解这个镜像里面到底有一些什么东西

2.4.5 进入当前正在运行的容器

通常容器都是使用后台方式运行,需要进入容器,修改一些配置

  • 方式1:docker exec -it 容器id bashShell
bash 复制代码
docker exec -it b1177469c5ce /bin/bash
ls
# bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
ps -ef
# UID          PID    PPID  C STIME TTY          TIME CMD
# root           1       0  0 05:35 ?        00:00:00 /bin/bash -c while true;do echo 666;sleep 1;done;
# root         654       0  0 05:46 pts/0    00:00:00 /bin/bash
# root         674       1  0 05:46 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
# root         675     654  0 05:46 pts/0    00:00:00 ps -ef
  • 方式2:docker attach 容器id
bash 复制代码
docker attach 596b80f933ac
  • docker exec, 进入容器后开启一个新的终端,可以在里面操作(常用)
  • docker attach, 进入容器正在执行的终端,不会启动新的进程
2.4.6 从容器内拷贝到主机上
  • docker cp 容器id:容器内路径 目的的主机路径
    • 拷贝是一个手动过程,使用 -v 卷的技术,可以实现数据的自动同步, 可以实现镜像的/home目录和主机的/home目录联通
相关推荐
小黑蛋学java1 小时前
Ubuntu Docker 安装手册
linux·ubuntu·docker
qq_3643717214 小时前
基于 Docker 容器化环境配置
运维·docker·容器
GentleDevin15 小时前
Docker 运维常用命令大全
docker·容器·运维命令
运维全栈笔记15 小时前
基于Docker的MinIO单机部署与功能测试指南
运维·docker·容器
心机之蛙qee16 小时前
docker的安装(RHEL9)
运维·docker·容器
炸炸鱼.16 小时前
Docker 高级管理 —— 容器通信技术与数据持久化
docker
乐hh16 小时前
DM8配置SSL
数据库·docker·ssl
极客先躯17 小时前
高级java每日一道面试题-2025年12月05日-实战篇[Dockerj]-Docker 安装后的默认存储路径是什么?如何修改?
java·docker·默认存储路径在不同系统上的区别·linux overlay2·修改存储路径的理论方法·修改流程中的关键理论点
凤舞飘伶17 小时前
windows安装docker-desk
windows·docker·容器
运维全栈笔记17 小时前
Docker一键部署Immich:自建私有云相册,照片视频备份无忧
linux·服务器·网络·docker·容器