Index of /releaseshttps://old-releases.ubuntu.com/releases/
官方正版VMware下载(16 pro):https://www.aliyundrive.com/s/wF66w8kW9ac
下载Linux系统镜像(阿里云盘不限速):https://www.aliyundrive.com/s/UQMBPEovxNg
(系统镜像下载后,把后缀改成iso即可正常使用)
安装:选一下安装地址,一直下一步即可。(可能会要求重启电脑,重启即可)
下载Linux系统镜像(阿里云盘不限速):阿里云盘分享
(系统镜像下载后,把后缀改成iso即可正常使用)
接下来看图操作
一路next安装即可,iso路径选对即可。
查看当前虚拟机的ip,ifconfig,提示没有安装网络工具,使用apt install net-tools安装即可
解决方案:修改ssh_config文件,需要安装vim命令 apt install vim
再次连接Ubuntu 成功
cat /etc/apt/sources.list 使用该命令查看当前的源地址
ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
选择对应的版本号,将下面的内容复制到sources.list文件全部覆盖即可。
apt-get update 执行该命令更新即可生效。
PPA 全称为 Personal Package Archives(个人软件包档案),是 Ubuntu Launchpad 网站提供的一项服务,当然不仅限于 Launchpad 。它允许个人用户上传软件源代码,通过 Launchpad 进行编译并发布为二进制软件包,作为 apt/新立得源供其他用户下载和更新。在Launchpad网站上的每一个用户和团队都可以拥有一个或多个PPA。
通常 PPA 源里的软件是官方源里没有的,或者是最新版本的软件。相对于通过 Deb 包安装来说,使用 PPA 的好处是,一旦软件有更新,通过 sudo apt-get upgrade 这样命令就可以直接升级到新版本。
直接使用ppa安装python3.10
add-apt-repository ppa:deadsnakes/ppa
使用以下命令刷新缓存:
apt update
安装python3.10
apt install python3.10
设置python的版本
apt-cache rdepends python3.8
检查当前版本
python3 --version
使用 update-alternatives 创建指向 python3 的符号链接
update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10
并通过以下命令选择使用哪一个作为 python3:
update-alternatives --config python3
为何需要安装python的虚拟环境?
apt install python3-pip
apt install virtualenv
使用pip 直接安装requests依赖测试安装成功。
总结安装虚拟环境的步骤:
1、安装虚拟环境工具,例如venv
2、创建一个新的虚拟环境
3、激活虚拟环境
4、在虚拟环境使用pip安装所需要的安装包
1、创建pip.conf文件,然后录入对应的镜像源
使用命令 pip config list 查看上面的配置是否生效
一句话:python需要下载很多包,Anaconda集成了几乎常用的包,这也是那么多数据分析者推荐Anaconda的原因。Anaconda 是一个用于科学计算的 Python 发行版,支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。
用途
快速安装,运行和升级及其依赖项
在计算机便捷的创建,和保存,加载和切换环境。如果你需要的包要求不同版本的Python,你无需切换到不同的环境,因为conda同样是一个环境管理器。仅需要几条命令,你可以创建一个完全独立的环境来运行不同的Python版本,同时继续在你常规的环境中使用你常用的Python版本。——conda官方网站
python和包以及anaconda的概念关系
基于自己对于这些概念术语之间的关系打一个小比方:
关于python与包 包 =“工具”;
下载包 = “买工具”;
写程序 = “用工具做东西”(程序import导入)
关于anaconda
环境 = “好比一栋楼,在楼里面分配一间屋给各种‘包’放,每间房里面的‘包’互不影响”
激活环境 = “告诉电脑,我现在要用这个屋子里面的‘包’来做东西了所以要进这间屋子”
移除环境 = “现在这个屋子里面我原来要用的东西现在不需要了把它赶出去节省电脑空间”
Conda创建环境相当于创建一个虚拟的空间将这些包都装在这个位置,我不需要了可以直接打包放入垃圾箱,同时也可以针对不同程序的运行环境选择不同的conda虚拟环境进行运行。
官网下载:https://www.anaconda.com/products/individualhttps://www.anaconda.com/products/individual1、推荐使用清华镜像网站下载:
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
选择你想要下载的Linux版本。
以Anaconda3-2020.07-Linux-x86_64为例子:
2、将下载的文件放到/root/ 文件夹下,然后进入文件夹执行命令:
bash Anaconda3-2020.07-Linux-x86_64.sh
3、一路next,出现yes时输入yes,然后enter确认安装路径即可。
4、添加环境变量:
5、查看该文件,在末尾增加
export PATH="/root/anaconda3/bin:$PATH"
/root/anaconda3/bin 就是上面安装的anaconda的路径
7、通过命令conda --version查看当前conda的版本,安装成功!
1、创建新的虚拟环境。
conda create -n my_env_conda python=3.10
my_env_conda 环境名称
3.10是python的版本
conda create --name myenvTest
激活conda:conda activate myenvTest
然后使用命令:conda info --envs 查看所有的conda
使用命令:conda install requests 安装自己需要的依赖
使用Anaconda Navigator(可选):Anaconda还提供了一个图形化界面工具Anaconda Navigator,用于管理环境、安装软件包和启动应用程序。你可以在终端中运行以下命令启动Anaconda Navigator:
anaconda-navigator
创建应用选择刚刚创建的env1虚拟环境中的python
点击应用则保存成功。
点击运行则看到是使用的我们配置的虚拟环境了。
https://www.jetbrains.com/pycharm/download/download-thanks.html?platform=linux&code=PCC
或者直接在Windows下载然后上传到对应的Linux的文件夹中。
解压文件: tar -xzf pycharm-community-2023.3.2.tar.gz
将文件解压然后移动到指定的文件夹下,/opt/pycharm
你好,python!
在 Ubuntu 上安装 Docker 非常直接。我们将会启用 Docker 软件源,导入 GPG key,并且安装软件包。首先,更新软件包索引,并且安装必要的依赖软件,来添加一个新的 HTTPS 软件源:
apt update
apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
将 Docker APT 软件源添加到系统报错了:(这一步好像不用管,不影响后续的安装docker可以忽略)
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt-get install python-apt
由于缺少上面的依赖,则需要安装此依赖
按照此操作还是会报错。
cp apt_pkg.cpython-38-x86_64-linux-gnu.so apt_pkg.so
然后再执行:add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" 报错就变了~~
apt update
apt install docker-ce docker-ce-cli containerd.io 安装最新的版本
想要安装指定版本,首先列出 Docker 软件源中所有可用的版本:
apt update
apt list -a docker-ce
5:25.0.0-1~ubuntu.20.04~focal
apt install docker-ce=
docker-ce-cli= containerd.io 指定版本安装
systemctl status docker
docker -v 查看安装的docker的版本
当一个新的 Docker 发布时,你可以使用标准的sudo apt update && sudo apt upgrade
流程来升级 Docker 软件包。
如果你想阻止 Docker 自动更新,锁住它的版本:
apt-mark hold docker-ce
如果本地没有该镜像,这个命令将会下载测试镜像,在容器中运行它,打印出 “Hello from Docker”,并且退出。
在卸载 Docker 之前,你最好 移除所有的容器,镜像,卷和网络。
运行下面的命令停止所有正在运行的容器,并且移除所有的 docker 对象:
docker container stop $(docker container ls -aq)
docker system prune -a --volumes
现在你可以使用apt
像卸载其他软件包一样来卸载 Docker:
apt purge docker-ce
apt autoremove
阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://86nahrjt666.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
systemctl start docker
systemctl stop docker
命令 |
说明 |
文档地址 |
---|---|---|
docker pull |
拉取镜像 |
docker pull |
docker push |
推送镜像到DockerRegistry |
docker push |
docker images |
查看本地镜像 |
docker images |
docker rmi |
删除本地镜像 |
docker rmi |
docker run |
创建并运行容器(不能重复创建) |
docker run |
docker stop |
停止指定容器 |
docker stop |
docker start |
启动指定容器 |
docker start |
docker restart |
重新启动容器 |
docker restart |
docker rm |
删除指定容器 |
docs.docker.com |
docker ps |
查看容器 |
docker ps |
docker logs |
查看容器运行日志 |
docker logs |
docker exec |
进入容器 |
docker exec |
docker save |
保存镜像到本地压缩文件 |
docker save |
docker load |
加载本地压缩文件到镜像 |
docker load |
docker inspect |
查看容器详细信息 |
docker inspect |
用一副图来表示这些命令的关系:
镜像:
docker image 本质上是一个 read-only 只读文件, 这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。
可以把docker image 理解成一个模板, 可以通过这个模板实例化出来很多容器。
image 里面是一层层文件系统 Union FS。联合文件系统,可以将几层目录挂载到一起,形成一个虚拟文件系统。 每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker镜像中每一层文件系统都是只读的。 构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统。
容器:
容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容器有初建、运行、停止、暂停和删除五种状态 。
容器的本质是主机上运行的一个进程,但是容器有自己独立的命名空间隔离和资源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上进程的本质区别。
容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个容器层,该层允许修改镜像的整个副本 。
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 msql
Docker run:创建并运行一个容器,-d是容器在后台运行
--name mysql:给容器起个名字,必须唯一
-p 3306:3306:设置端口映射,前面是宿主机端口,后面是容器的端口
-e KEY=VALUE::设置环境变了
mysql:指定运行的镜像名称
docker pull nginx 拉取镜像
docker save -o nginx.tar nginx:latest 保存到本地
docker rmi nginx:latest 删除nginx镜像
使用 docker load -i nginx.tar 将上面删除的nginx重新加载回来。
创建并运行nginx:docker run -d --name nginx -p 80:80 nginx
docker exec -it nginx bash
docker rm mysql2(容器名)
容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便。大家思考几个问题:
如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了?
MySQL、Nginx容器运行后,如果我要修改其中的某些配置该怎么办?
我想要让Nginx代理我的静态资源怎么办?
因此,容器提供程序的运行环境,但是程序运行产生的数据、程序运行依赖的配置都应该与容器解耦。
通过数据卷实现宿主机和容器文件的双向绑定。
以Nginx为例,我们知道Nginx中有两个关键的目录:
html
:放置一些静态资源
conf
:放置配置文件
如果我们要让Nginx代理我们的静态资源,最好是放到html
目录;如果我们要修改Nginx的配置,最好是找到conf
下的nginx.conf
文件。
但遗憾的是,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。如图:
在上图中:
我们创建了两个数据卷:conf
、html
Nginx容器内部的conf
目录和html
目录分别与两个数据卷关联。
而数据卷conf和html分别指向了宿主机的/var/lib/docker/volumes/conf/_data
目录和/var/lib/docker/volumes/html/_data
目录
这样以来,容器内的conf
和html
目录就 与宿主机的conf
和html
目录关联起来,我们称为挂载。此时,我们操作宿主机的/var/lib/docker/volumes/html/_data
就是在操作容器内的/usr/share/nginx/html/_data
目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。
小提示:
/var/lib/docker/volumes
这个目录就是默认的存放所有容器数据卷的目录,其下再根据数据卷名称创建新目录,格式为/数据卷名/_data
。
为什么不让容器目录直接指向宿主机目录呢?
因为直接指向宿主机目录就与宿主机强耦合了,如果切换了环境,宿主机目录就可能发生改变了。由于容器一旦创建,目录挂载就无法修改,这样容器就无法正常工作了。
但是容器指向数据卷,一个逻辑名称,而数据卷再指向宿主机目录,就不存在强耦合。如果宿主机目录发生改变,只要改变数据卷与宿主机目录之间的映射关系即可。
使用命令 docker exec -it nginx bash 进入容器内部查看内容
使用MobaXterm_Personal_23.6工具将静态图片上传到Linux系统里面,直接访问路径成功
http://192.168.79.129/abc.png
修改前:
修改后:
cd /var/lib/docker/volumes/html/_data
vim index.html 修改文件,esc/:wq 保存退出
拉取的镜像是mysql:8.0.20
#!/bin/sh
docker run \
-p 3307:3306 \
--name mysql8 \
--privileged=true \
--restart unless-stopped \
-v /docker/mysql8.0.20/mysql:/etc/mysql \
-v /docker/mysql8.0.20/logs:/logs \
-v /docker/mysql8.0.20/data:/var/lib/mysql \
-v /etc/localtime:/etc/localtime \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:8.0.20
链接成功。
[client]
default_character_set=utf8mb4
[mysql]
default_character_set=utf8mb4
[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v ./mysql/data:/var/lib/mysql \
-v ./mysql/conf:/etc/mysql/conf.d \
-v ./mysql/init:/docker-entrypoint-initdb.d \
mysql
由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。
而这种记录镜像结构的文件就称为Dockerfile,其对应的语法可以参考官方文档:
Dockerfile reference | Docker Docs
指令 |
说明 |
示例 |
---|---|---|
FROM |
指定基础镜像 |
|
ENV |
设置环境变量,可在后面指令使用 |
|
COPY |
拷贝本地文件到镜像的指定目录 |
|
RUN |
执行Linux的shell命令,一般是安装过程的命令 |
|
EXPOSE |
指定容器运行时监听的端口,是给镜像使用者看的 |
EXPOSE 8080 |
ENTRYPOINT |
镜像中应用的启动命令,容器运行时调用 |
ENTRYPOINT java -jar xx.jar |
dockerfile:
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
jar下载地址
命令说明:
docker build
: 就是构建一个docker镜像
-t docker-demo:1.0
:-t
参数是指定镜像的名称(repository
和tag
)
.
: 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.
代表当前目录,也可以直接指定Dockerfile目录
docker logs -f dd 查看容器日志
http://192.168.79.129:8080/hello/count 访问地址成功!
docker rmi image_id 这里的image_id可以根据docker images 查看
docker rm image_id 删除单个
docekr rmi image_id1/容器名1 image_id2/容器名2
docker rmi -f image_id 强制删除镜像
如果使用默认的网桥,mysql第一次是172.168.0.2 如果下次后启动该ip可能被其他容器占用,所以需要自定义网桥。
容器名不变,根据容器名访问,ip变了无关紧要。
docker networ create heima 创建网络heima
使用命令 docker network ls 查看网络是否创建成功
docker network connect heima mysql
将容器mysql连接到网络heima
docker inspect mysql 查看网络详情,链接成功
docker run -d --name dd -p 8080:8080 --network heima docekr-demo 创建容器dd加入网络heima中
docker inspect dd 进入容器dd查看详情
docker exec -it dd bash 进入容器内部,ping mysql 可以拼通,因为这两个容器都在heima网络里面。ping nginx不通,不在同一个网络里面。
docker inspect nginx 可以看到nginx在默认的bridge网络里面
docekrfile:
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY hm-service.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
hm-service.jar下载链接:
进入对应的文件夹下,创建镜像:docker build -t hmall . 末尾的.代表当前目录
docker run -d --name hmall -p 8080:8080 --network heima hmall
创建hmall容器,指定heima网络,此后就可以访问mysql了,同一个网络
使用docker logs -f hmall 查看容器hmall启动日志
http://192.168.79.129:8080/search/list?pageNo=1&pageSize=5
获取数据成功,说明部署成功!
前端html的压缩包下载地址
nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/json;
sendfile on;
keepalive_timeout 65;
server {
listen 18080;
# 指定前端项目所在的位置
location / {
root /usr/share/nginx/html/hmall-portal;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /api {
rewrite /api/(.*) /$1 break;
proxy_pass http://hmall:8080;
}
}
server {
listen 18081;
# 指定前端项目所在的位置
location / {
root /usr/share/nginx/html/hmall-admin;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /api {
rewrite /api/(.*) /$1 break;
proxy_pass http://hmall:8080;
}
}
}
docker rm nginx
docker run -d --name nginx -p 18080:18080 -p 18081:18081 -v /root/nginx/html:/usr/share/nginx/html -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf --network heima nginx
访问链接查看成功!
http://192.168.79.129:18080/
docker logs -f hmall
点击前端的界面搜索,可以看到数据发生了变化,说明前后端联动成功了,数据也是从数据库读取的了。
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- hm-net
hmall:
build:
context: .
dockerfile: Dockerfile
container_name: hmall
ports:
- "8080:8080"
networks:
- hm-net
depends_on:
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "18080:18080"
- "18081:18081"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- hmall
networks:
- hm-net
networks:
hm-net:
name: hmall
现在可以使用dockercompose 一键部署,需要注意的就是编写dockercompose.yml文件
安装前删除所有的容器(相同的)
docker compose up -d 一键部署命令
安装成功,再次访问 http://192.168.79.129:18080/search.html