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
目录联通
- 拷贝是一个手动过程,使用 -v 卷的技术,可以实现数据的自动同步, 可以实现镜像的