Docker学习笔记(一)

文章目录

  • Docker概述
    • Docker为什么会出现?
    • 为什么选择Docker
    • Docker的历史
  • Docker安装
    • Docker的基本组成
    • 在Ubuntu上安装Docker
      • 1.Uninstall old versions(卸载旧版本)
      • 2.Install using the repository
  • Docker的常用命令
    • 帮助命令
    • 镜像命令
    • 容器命令
    • 常用其他命令
      • 后台启动容器
      • 查看日志和容器内部进程信息
      • 查看容器元数据
      • 进入当前正在运行的容器
      • 从容器内拷贝文件到主机上
    • 命令汇总

Docker概述

Docker为什么会出现?

一款产品:开发–上线 两套环境!应用环境,应用配置

开发 — 运维。问题:在我的电脑上可以运行!版本更新,导致服务不可用!

环境配置是十分麻烦的,每一个机器都要部署环境(集群Redis, ES, Hadoop…)!费时费力

发布一个项目(jar + (Redis MySQL jdk ES)),项目能不能带上环境打包。

windows开发,发布到linux。

传统:开发jar,运维来做!

现在:开发打包部署上线,一套流程做完。

Docker给以上问题,提出了解决方案

Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker的基础是Linux容器(LXC)等技术。

在LXC的基础上Docker进行了进一步的封装,让用户不需要去关心容器的管理,使其操作更为方便。用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样方便。

下图比较了Docker和传统虚拟化技术的不同之处,容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。

Docker学习笔记(一)_第1张图片

Docker学习笔记(一)_第2张图片


在任何地方开发,部署和运行任何应用

Docker是一款针对程序开发人员和系统 管理员来开发,部署,运行应用的一款虚拟化产品。Docker可以让你像使用集装箱一样快速的组合成应用,并且可以向运输标准集装箱一样,尽可能的屏蔽代码层面的差异。Docker会尽可能的缩短从代码测试到产品部署的时间。

Docker组件

  • The Docker Engine - Docker Engine是一个基于虚拟化技术的轻量级并且功能强大的开源容器引擎管理工具。它可以将不同的 work flow 组合起来构建成你的应用。
  • Docker Hub 可以分享和管理你的images镜像的一个 Saas 服务。

为什么选择Docker

快速交付应用程序

  • 我们希望你的开发环境能够更好的提高你的工作效率。Docker容器能够帮助开发人员、系统管理员、QA和版本控制工程师在一个生产环节中一起协同工作。我们制定了一套容器标准,而这套容器标准能够使系统管理员更改容器的时候,程序员不需要关心容器的变化,而更专注自己的应用程序代码。从而隔离开了开发和管理,简化了开发和部署的成本。
  • 我们使应用的构建方式更加简单,可以快速的迭代你的应用,并且可以可视化的来查看应用的细微更改。这能够帮助组织里边的成员来更好的理解一个应用从构建到运行的过程。
  • Docker 是一个轻量级的容器,所以它的速度是非常快的,而容器的启动时间只需要一秒钟,从而大大的减少了开发、测试和部署的时间。轻松部署和扩展。
  • Docker 容器可以运行在大多数的环境中,你可以在桌面环境、物理主机、虚拟主机再到数据中,私有或者公有云中部署。
  • 因为 Docker 可以从多平台下运行。你可以很容器的迁移你的应用程序。如果需要,你可以非常简单的将应用程序从测试环境迁移到云,或者从云迁移到测试环境。
  • Docker 是一个轻量级的容器,因此它可以在很短的时间内启动和关闭。当你需要的时候,你可以启动多个容器引擎,并且在不需要使用他们的时候,可以将他们全部关闭。

Docker的历史

2010年,几个搞IT的年轻人,在美国成立了一家公司dotCloud

做一些pass的云计算服务!LXC有关的容器技术。

他们将自己的技术(容器化技术)命名为Docker!

Docker刚刚诞生的时候,没有引起行业的注意!dotCloud,就活不下去!

开源

2013年,Docker开放源代码!

Docker被越来越多的人发现了其有点,火了,Docker每个月都会更新一个版本!

2014年4月9日,Docker1.0发布!

Docker为什么这么火?十分的轻巧

在容器技术出来之前,我们使用的都是虚拟机技术。

虚拟机:在Windows中安装一个Vmware,通过这个软件我们可以虚拟出来一台或多台电脑,但是笨重

虚拟机也属于一种虚拟化技术,Docker容器技术,也是一种虚拟化技术。

vm; linux centos原生镜像(一个电脑!) 隔离:需要开启多个虚拟机!
docker:隔离,镜像(最核心的环境)十分小巧,运行镜像就可以了!小巧!你个M KB 秒级启动!

到现在,所有开发人员都必须要会Docker!

聊聊docker

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HEgCuyOe-1615020791732)(C:\Users\linfei\AppData\Roaming\Typora\typora-user-images\image-20210306111236763.png)]

Docker是基于Go语言开发的!开源项目!

官方文档:https://docs.docker.com/

仓库地址:https://hub.docker.com/

Docker安装

Docker的基本组成

Docker学习笔记(一)_第3张图片

镜像(image):

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

容器(container):

Docker利用容器技术,独立运行一个或一组应用,通过镜像来创建。

启动,停止,删除,基本命令!

目前可以把容器理解为就是一个简易的linux系统。

仓库(repository):

仓库就是存放镜像的地方!

仓库分为公有仓库和私有仓库!

Docker Hub(国外)

阿里云等国内厂商也都有容器服务器(配置镜像加速!)

在Ubuntu上安装Docker

OS requirement:

Docker Engire支持以下64位Ubuntu版本:

  • Ubuntu Groovy 20.10
  • Ubuntu Focal 20.04 (LTS)
  • Ubuntu Bionic 18.04 (LTS)
  • Ubuntu Xenial 16.04 (LTS)

Docker Engine 支持上 x86_64(或 amd64)armhf,arm64架构。

1.Uninstall old versions(卸载旧版本)

$ sudo apt-get remove docker docker-engine docker.io containerd runc

2.Install using the repository

更新apt包索引,并安装apt依赖包,用于通过HTTPS来获取仓库

$ sudo apt-get update 
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg

添加Docker官方GPG密钥:

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

设置稳定仓库:

$ echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装Docker Engire:

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

验证安装是否成功:

$ sudo docker run hello-world
linfei@ubuntu:~$ sudo docker run hello-world
[sudo] password for linfei: 

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

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

可以看到docker已经安装成功了,使用docker-v查看版本

linfei@ubuntu:~$ docker -v
Docker version 20.10.4, build d3cb89e
linfei@ubuntu:~$ docker version
Client: Docker Engine - Community
 Version:           20.10.4
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        d3cb89e
 Built:             Thu Feb 25 07:05:21 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true
Got 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/version: dial unix /var/run/docker.sock: connect: permission denied
#use sudo to avoid permission denied
linfei@ubuntu:~$ sudo docker version
[sudo] password for linfei: 
Client: Docker Engine - Community
 Version:           20.10.4
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        d3cb89e
 Built:             Thu Feb 25 07:05:21 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.4
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       363e9a8
  Built:            Thu Feb 25 07:03:17 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.3
  GitCommit:        269548fa27e0089a8b8278fc4fc781d7f65a939b
 runc:
  Version:          1.0.0-rc92
  GitCommit:        ff819c7e9184c13b7c2607fe6c30ae19403a7aff
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

Docker的常用命令

帮助命令

docker version  #显示docker的版本信息
docker info     #显示docker的系统信息,包括镜像和容器的数量
docker command --help #帮助命令

帮助文档地址:https://docs.docker.com/reference/

镜像命令

$ docker images           #显示所有本地主机上的镜像
$ docker search mysql     #搜索镜像
$ docker pull mysql       #下载镜像
$ docker pull mysql:5.7   #指定版本下载镜像
$ docker rmi -f ID/name   #删除镜像
$ docker rmi -f $(docker images -aq) #删除所有镜像
linfei@ubuntu:~$ docker images
Got 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/images/json: dial unix /var/run/docker.sock: connect: permission denied

docker安装完成,一般用户没有权限启动docker服务,只能通过sudo来通过root用户权限来启动docker,此时对于一般用户而言,需要执行docker ps或者docker images命令查看容器或者镜像提示如题所示的错误。

docker进程使用 Unix Socket 而不是 TCP 端口。而默认情况下,Unix socket 属于 root 用户,因此需要 root权限 才能访问。

解决办法:

  • 使用sudo docker ps 或者sudo docker images
  • 把普通用户加到docker用户组中
sudo groupadd docker          #添加docker用户组
sudo gpasswd -a $XXX docker   #检测当前用户是否已经在docker用户组中
sudo gpasswd -a $USER docker  #将当前用户添加至docker用户组
newgrp docker                 #更新docker用户组
linfei@ubuntu:~$ docker images
Got 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/images/json: dial unix /var/run/docker.sock: connect: permission denied
linfei@ubuntu:~$ groupadd docker 
groupadd: group 'docker' already exists
linfei@ubuntu:~$ sudo gpasswd -a $linfei docker
[sudo] password for linfei: 
gpasswd: user 'docker' does not exist
linfei@ubuntu:~$ sudo gpasswd -a linfei docker
Adding user linfei to group docker
linfei@ubuntu:~$ newgrp docker
linfei@ubuntu:~$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    bf756fb1ae65   14 months ago   13.3kB
#可以看到不再出现 “Got permission denied”错误

#说明
REPOSITORY  镜像的仓库源
TAG         镜像的标签
IMAGE ID    镜像ID
CREATED     镜像创建的时间
SIZE        镜像的大小
#可选项
--all , -a		Show all images (default hides intermediate images)
--quiet , -q	Only show image IDs
linfei@ubuntu:~$ docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10578     [OK]       
mariadb                           MariaDB Server is a high performing open sou…   3957      [OK]       
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   776                  [OK]
#可选项
--filter , -f		Filter output based on conditions provided
--filter=STARS=3000 #搜索出STARS大于3000的镜像
--limit	25(default)	Max number of search results

容器命令

说明:有了镜像才可以创建容器,下载一个centos镜像用来学习。

linfei@ubuntu:~$ docker pull centos
Using default tag: latest
latest: Pulling from library/centos
7a0437f04f83: Pull complete 
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

新建容器并启动

docker run [options] image
#options
--name		Assign a name to the container
-d          后台方式运行
-it         使用交互方式运行,进入容器查看内容
-p          指定容器的端口 -p 8080:8080
    -p  主机端口:容器端口(常用)
    -p  容器端口
-P          随机指定端口     
#启动并进入容器
linfei@ubuntu:~$ docker run -it centos /bin/bash
[root@028d6a81fbbe /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@028d6a81fbbe /]# exit(退出)
$ docker ps #列出当前正在运行的容器
-a          # 当前正在运行的容器 + 历史运行过的容器
-n=1
-q         #只显示容器编号
linfei@ubuntu:~$ docker ps #列出当前正在运行的容器
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
linfei@ubuntu:~$ docker ps -a # 当前正在运行的容器 + 历史运行过的容器
CONTAINER ID   IMAGE         COMMAND       CREATED         STATUS                       PORTS     NAMES
028d6a81fbbe   centos        "/bin/bash"   2 minutes ago   Exited (127) 7 seconds ago             sleepy_archimedes
4d6cccd622ff   hello-world   "/hello"      5 days ago      Exited (0) 5 days ago                  nostalgic_leakey
1199f2f07361   hello-world   "/hello"      5 days ago      Exited (0) 5 days ago                  frosty_hamilton
exit     #直接停止容器并退出
Ctrl + P + Q  #容器不停止退出

删除容器

docker rm 容器id              #删除指定容器,不能删除正在运行的容器。
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     #强制停止

常用其他命令

后台启动容器

$ docker run -d centos
#常见的坑:docker容器后台运行,就必须有一个前台进程,docker没发现应用,就会自动停止

查看日志和容器内部进程信息

$ docker logs -f -t -n number 容器id
$ docker top 容器id  #查看容器内部的进程信息
linfei@ubuntu:~$ docker top 028d6a81fbbe
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                5058                5032                0                   00:25               pts/0               00:00:00            /bin/bash

查看容器元数据

$ docker inspect 容器id

进入当前正在运行的容器

#当容器后台运行时,我们需要进入容器修改一些配置
$ docker exec -it 容器id /bin/bash
#方式二
$ docker attach 容器id

# docker exec  进入容器后开启一个新的终端,可以在里面操作
# docker attach  进入容器内正在执行的终端,不会启动新的进程

从容器内拷贝文件到主机上

$ docker cp 容器id:容器内路径  目的主机路径
linfei@ubuntu:~$ docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
028d6a81fbbe   centos    "/bin/bash"   40 minutes ago   Up 17 minutes             sleepy_archimedes
linfei@ubuntu:~$ docker attach 028d6a81fbbe 
[root@028d6a81fbbe /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@028d6a81fbbe /]# cd home/
[root@028d6a81fbbe home]# ls
[root@028d6a81fbbe home]# touch test.java
[root@028d6a81fbbe home]# ls
test.java
[root@028d6a81fbbe home]# exit
exit
linfei@ubuntu:~$ docker ps -a
CONTAINER ID   IMAGE         COMMAND       CREATED          STATUS                      PORTS     NAMES
028d6a81fbbe   centos        "/bin/bash"   41 minutes ago   Exited (0) 20 seconds ago             sleepy_archimedes
4d6cccd622ff   hello-world   "/hello"      5 days ago       Exited (0) 5 days ago                 nostalgic_leakey
1199f2f07361   hello-world   "/hello"      5 days ago       Exited (0) 5 days ago                 frosty_hamilton
linfei@ubuntu:~$ docker cp 028d6a81fbbe:/home/test.java /home/linfei
linfei@ubuntu:~$ ls
Desktop  Documents  Downloads  examples.desktop  Music  Pictures  Public  snap  Templates  test.java  Videos
#拷贝是一个手动过程,未来我们使用数据卷技术,自动同步数据

命令汇总

Docker学习笔记(一)_第4张图片

本文是学习B站up主遇见狂神说的Docker教程,记录的学习笔记,还有一些网上的内容。

你可能感兴趣的:(docker学习笔记,运维,容器)