$ docker pull composer:1.9.0
# 启动Composer镜像
$ docker run --rm \
-it \
-v ${PWD}:/app \
composer:1.9.0 /bin/bash
# 创建composer.json文件
$ composer init -n
# 使用国内 Packagist镜像
$ composer config repo.packagist composer https://mirrors.aliyun.com/composer/
# 添加laravel包
$ composer require -vvv \
--prefer-dist \
--prefer-stable \
laravel/installer
# 看到以下输出,说明添加成功。
Writing lock file
Generating autoload files
# 在当前目录覆盖安装laravel
$ ./vendor/bin/laravel new
# 看到以下输出,说明安装成功。
Package manifest generated successfully.
Application ready! Build something amazing.
# 退出Composer镜像
$ exit
将当前目录下的storage目录权限,设为757
因为阿里的弹性WEB托管,使用php 5.5.30版本,所以只能安装Laravel 5.2版本。
本教程使用WSL + docker环境安装,除完整的laravel环境外,不会在本地留下任何痕迹。
$ docker pull composer:1.9.0
# 启动Composer镜像
$ docker run --rm \
-it \
-v ${PWD}:/app \
composer:1.9.0 /bin/bash
# 使用国内 Packagist镜像
$ composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
$ composer create-project -vvv \
--prefer-dist \
--no-scripts \
--keep-vcs \
laravel/laravel:5.2.31 \
YSME
# 看到以下输出,说明安装完成。
Writing lock file
Generating autoload files
# 退出Composer镜像
$ exit
copy YSME目录下的全部内容,到虚拟主机的目录下即可。
访问 http://你的域名/YSME/public/ 如果显示 Laravel 5 字样,说明安装成功!
在 Docker 的容器内开发,相当于使用VSCode的远程开发能力,好处非常多。
这不废话嘛,同上。
官方推荐安装 Remote Development 这个扩展包,它包括三个扩展功能:
如果你只使用 Docker ,可以只安装 Remote - Containers 这个扩展。
安装成功后,你可以在 VSCode 的左下角,看到一个“蓝底色+两个相对白箭头”的图标。
点击图标,可以看到 Remote - Containers 提供了许多方法进行配置。
照着 docker-compose.yml 进行修改,见下面示例
# 字符串方式
command: /bin/bash -c "cp /app/dtest/config.default.yml /app/config.yml && python -u /app/dtest/tcc.py"
# 另一种方式
command: ["/bin/bash","-c","while","true;","do","sleep","1;","done"]
# 配置文件方式
......
启动后停在cli,等待登录
stdin_open: true # 对应 docker run 中的 -i
tty: true # 对应 docker run 中的 -t
在 Alpine 上安装 Docker 真是一件让人感觉非常愉快的事情,因为过程非常简单。
$ nano /etc/apk/repositories
因为 docker 在社区的库里,所以要打开 community 的源。
#/media/cdrom/apks
http://mirrors.tuna.tsinghua.edu.cn/alpine/v3.16/main
http://mirrors.tuna.tsinghua.edu.cn/alpine/v3.16/community
#http://mirrors.tuna.tsinghua.edu.cn/alpine/edge/main
#http://mirrors.tuna.tsinghua.edu.cn/alpine/edge/community
#http://mirrors.tuna.tsinghua.edu.cn/alpine/edge/testing
$ apk update
$ apk add docker docker-cli-compose
# 这里要特别注意,docker compose 的包名在 Alpine 里是 docker-cli-compose,不是 docker-compose-plugin。
# docker-compose 包是 compose 的独立安装包,官方已经不再支持这种安装方式。
...
$ docker -v
Docker version 20.10.16, build aa7e414fdcb23a66e8fabbef0a560ef1769eace5
$ docker compose version
Docker Compose version v2.12.2
尝试使用 Ubuntu 的 Snap 后,发现真的非常方便。
看过Snap的介绍以后,发现Snap的沙盒理念非常先进,在存储基本不成问题背景下,会系统环境的影响更小。
而且docker-compose命令也会一起安装,更是方便。
$ sudo snap install docker
# 设置开机启动
$ sudo snap start docker --enable
# 确认服务状态
$ sudo snap services docker
# 查看服务详情
$ service snap.docker.dockerd status
使用sudo安装后要注意以后调用时,都要使用sudo命令前缀。
# 安装目录
/snap/docker/current
# 服务启动配置文件
/etc/systemd/system/snap.docker.dockerd.service
# 配套 AppArmor 配置文件
/var/lib/snapd/apparmor/profiles/snap.docker.docker
/var/lib/snapd/apparmor/profiles/snap.docker.dockerd
# 默认 Unix Socket 文件路径
unix:///var/snap/docker/current/run/docker/libcontainerd/docker-containerd.sock
开发环境还是建议使用 Docker 来搭建,方便快捷。 不过 Django 的官方镜像已经弃用了,官方建议新版本使用 Python 官方提供的镜像来构建。
Docker
┗ Python == 3.9.12-buster
┗ Django == 3.2.13 LTS
┗ django-simpleui==2022.11.30
可以参考[https://github.com/Cuile/Docker-to-Python/tree/master/Django],提供了 Dockerfil、yml 文件,还提供全套使用命令。
# 创建项目
$ django-admin startproject mysite
$ cd mysite
# 生成项目
$ python manage.py startapp websrc
# 运行项目测试
$ python manage.py runserver 0.0.0.0:80
修改配置后,建议使用项目调试的方式启动,不要使用快捷命令,项目正常启动稳定运行后,再使用快捷命令。
# settings.py
# 任意地址都可以访问 Django
ALLOWED_HOSTS = ['*']
# 添加 simpleui 模板,和创建的项目
INSTALLED_APPS = [
'simpleui',
'websrc',
'......',
]
# 这个与多语种有关,在项目初始阶段不要修改,后续添加了多语种支持再修改,否则会导致无法启动。
# 具体参考(http://www.i18nguy.com/unicode/language-identifiers.html),有个傻逼教程,上来就改成 zh-CN 果然导致项目无法正常启动。
# 正确的简体中文代码如下:
LANGUAGE_CODE = 'zh-Hans'
# 时区,上海就代表北京时间,这个不能写错,写错就启动不了
# 具体参考(https://en.wikipedia.org/wiki/List_of_tz_database_time_zones),这里是标准的,有个傻逼教程非给写成 Asia/Beijing 导致怎么都起不来,太TMD的二逼了。
# 正解的北京时间时区如下:
TIME_ZONE = 'Asia/Shanghai'
# 启动翻译,与上面的 LANGUAGE_CODE 设置相对应
USE_I18N = True
# 启动格式控制
USE_L10N = True
# 启动时区
USE_TZ = True
$ python manage.py createsuperuser
Username: admin
Email address: [email protected]
Password: **********
Password (again): *********
Superuser created successfully.
访问项目链接,比如"http://127.0.0.1:8000/admin/
其实网上相关的文章已经非常多了,所以这篇文章的作用只是记录和明确一条确定可行的操作路径,为以后的操作节省时间,毕竟像我一样大部分人都不是专业的系统管理员,能够快速解决问题就可以了,并不想做过多的专业研究与探索。
本操作手册是官方手册与网上手册的结合版本,集两家之所长,亲自操作可用。
# 安装 Docker 证书
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc\
sudo echo
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" |
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
# 安装 Docker
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 启动 Docker
sudo systemctl enable docker.service
sudo systemctl start docker.service
# 测试
sudo docker version
> Client: Docker Engine - Community
> ...
> Server: Docker Engine - Community
> ...
sudo docker compose version
> Docker Compose version v...
# 使用非 root 用户管理 Docker
# 创建 docker 用户组
sudo groupadd docker
# 将当前用户添加到 docker 用户组
sudo usermod -aG docker $USER
# 重启
# 再次测试
docker version
> Client: Docker Engine - Community
> ...
> Server: Docker Engine - Community
> ...
docker compose version
> Docker Compose version v...
# 查看系统版本
cat /etc/redhat-release
> CentOS Linux release 7.6.1810 (Core) // CentOs 7 以上版本
# 查看系统内核版本
uname -r
> 4.10.4-1.el7.elrepo.x86_64 // 内核版本要>3.10
# 卸载旧版本
yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-selinux
docker-engine-selinux
docker-engine
# 安装依赖包
yum install -y yum-utils lvm2
device-mapper-persistent-data
# 添加 Docker 软件源
# 如果系统已切换到阿里云镜像源地址,可跳过此步。
# 阿里云镜像自带docker源
yum-config-manager
--add-repo
https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 使用官方源
yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast
# CentOS 8 or Rocky 9 使用timer替换fast
yum makecache timer
# 安装 Docker
# 如果在 Rocky 9 系统上,会提示containerd.io版本过低,或下载失败,需要独立安装containerd.io
# 可以重试几次
yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 启动 Docker
# 设为开机启动
systemctl enable docker.service
# 启动服务
systemctl start docker.service
# 测试
docker run hello-world
> Unable to find image 'hello-world:latest' locally
> latest: Pulling from library/hello-world
> 1b930d010525: Pull complete
> Digest: sha256:6540fc08ee6e6b7b63468dc3317e3303aae178cb8a45ed3123180328bcc1d20f
> Status: Downloaded newer image for hello-world:latest
>
> 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 compose version
> Docker Compose version v...
若能正常输出以上信息,则说明安装成功。
docker image ls -a
# or
docker images
docker container ls -a
# or
docker ps
docker compose -f <yaml_file> logs [-f] [service name]
# or
docker logs [-f] [container id]
docker compose -f <yaml_file> config
echo 'y' | docker system prune
# 导入
docker load -i <image>.tar
# 导出
docker save -o <image>.tar <image_name:label>
# 创建临时容器
docker conatiner create --name <container_name> <image_name>
# 从容器复制文件到宿主机
docker conatiner cp <container_name>:<file_path> <dest_path>
# 清理临时窗口
docker container rm <container_name>
docker network create [name]
// /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
]
}
systemctl daemon-reload
systemctl restart docker
echo "alias d-ll='docker image ls -a; echo; docker container ls -a'" >> ~/.bashrc \
&& echo "alias d-ps='docker ps'" >> ~/.bashrc \
&& echo "alias d-clean='docker system prune -f'" >> ~/.bashrc \
&& echo "alias d-rm='_a(){ docker image rm $1; echo; docker container rm $1; }; _a'" >> ~/.bashrc \
&& echo "alias d-exec='_a(){ docker exec -it $1 /bin/bash; }; _a'" >> ~/.bashrc \
&& echo "alias d-stop='_a(){ docker container stop $1; }; _a'" >> ~/.bashrc \
&& echo "alias d-kill='_a(){ docker container kill $1; }; _a'" >> ~/.bashrc
source ~/.bashrc