一款产品:开发–上线 两套环境!应用环境,应用配置
开发 — 运维。问题:在我的电脑上可以运行!版本更新,导致服务不可用!
环境配置是十分麻烦的,每一个机器都要部署环境(集群Redis, ES, Hadoop…)!费时费力
发布一个项目(jar + (Redis MySQL jdk ES)),项目能不能带上环境打包。
windows开发,发布到linux。
传统:开发jar,运维来做!
现在:开发打包部署上线,一套流程做完。
Docker给以上问题,提出了解决方案
Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker的基础是Linux容器(LXC)等技术。
在LXC的基础上Docker进行了进一步的封装,让用户不需要去关心容器的管理,使其操作更为方便。用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样方便。
下图比较了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/
镜像(image):
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===>run==>tomcat01容器(提供服务),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器(container):
Docker利用容器技术,独立运行一个或一组应用,通过镜像来创建。
启动,停止,删除,基本命令!
目前可以把容器理解为就是一个简易的linux系统。
仓库(repository):
仓库就是存放镜像的地方!
仓库分为公有仓库和私有仓库!
Docker Hub(国外)
阿里云等国内厂商也都有容器服务器(配置镜像加速!)
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架构。
$ sudo apt-get remove docker docker-engine docker.io containerd runc
更新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 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 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
#拷贝是一个手动过程,未来我们使用数据卷技术,自动同步数据
本文是学习B站up主遇见狂神说的Docker教程,记录的学习笔记,还有一些网上的内容。