docker 安装与使用

时间:2024-10-12 07:32:53

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 以上,查看环境信息:
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
# 卸载旧版本
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 帮助命令
  • docker version 显示docker的版本信息。
  • docker info 显示docker的系统信息,包括镜像和容器的数量
  • docker --help 帮助命令
    帮助文档的地址:https://docs.docker.com/engine/reference/commandline/docker/
2.2 镜像命令
  • docker images 查看所有本地主机上的镜像 可以使用docker image ls代替
  • docker search 搜索镜像
  • docker pull 下载镜像 docker image pull
  • docker rmi 删除镜像 docker image rm
    使用说明:
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 的镜像试验一下:

# 拉取镜像
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
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
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
docker attach 596b80f933ac
  • docker exec, 进入容器后开启一个新的终端,可以在里面操作(常用)
  • docker attach, 进入容器正在执行的终端,不会启动新的进程
2.4.6 从容器内拷贝到主机上
  • docker cp 容器id:容器内路径 目的的主机路径
    • 拷贝是一个手动过程,使用 -v 卷的技术,可以实现数据的自动同步, 可以实现镜像的/home目录和主机的/home目录联通