https://labs.play-with-docker.com/
web端做实验,不用本地安装,每次4小时
-----------------------------------------------
参照B站视频教程而写, 方便大家学习使用
课程
- 【docker入门】10分钟,快速学会docker
- 【docker入门2】实战~如何组织一个多容器项目docker-compose
- 【Docker】Dockerfile用法全解析
- 【kubernetes入门】快速了解和上手容器编排工具k8s
文档
https://blog.csdn.net/wantaway314/category_11020345.html
评论区笔记
- 安装和常用CLI:
- 添加阿里云镜像:sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装命令:sudo yum install -y docker-ce docker-ce-cli containerd.io
- 启动命令:sudo systemctl start docker
- 添加当前用户到docker用户组:sudo usermod -aG docker $USER (需注销),newgrp docker (立即生效)
- Helloworld:docker run hello-world (本地没有镜像的话会自动从远端仓库pull)
- pull nginx 镜像:docker pull nginx(等效于nginx:latest)
- 运行:docker run -【d】(后台运行不阻塞shell) 【-p 80:80】(指定容器端口映射,内部:外部) nginx
- 查看正在运行:docker ps
- 删除容器:docker rm -f <container id(不用打全,前缀区分)>
- 进入bash:docker exec -it <container id(不用打全,前缀区分)> bash
- commit镜像:docker commit <container id(不用打全,前缀区分)> <name>
- 查看镜像列表:docker images (刚才commit的镜像)
- 使用运行刚才commit的镜像:docker run -d <name>
- 使用Dockerfile构建镜像:docker build -t <name> <存放Dockerfile的文件夹>
- 删除镜像:docker rmi <name>
- 保存为tar:docker save <name> > <tar name>
- 从tar加载:docker load < <tar name>
- 一些启动参数:
- 后台运行容器:-d
- 容器内外端口映射:-p 内部端口号:外部端口号
- 目录映射:-v 'dir name' : <dir>
- 指定映像版本:<name>:<ver>
镜像是不能运行的,是静态的,而容器是可以运行的,是动态的。
CONTAINER容器
# 下载nginx
docker pull nginx
# 查看本地镜像
docker images
# -d让后台运行不阻塞shell指定窗口-p制定内外端映射
docker run nginx
docker run -d -p 80:80 nginx
# 查看正在运行的容器
docker ps
# 进入容器
docker exec -it id号 bash
下载nginx镜像
# 镜像拉取 如nginx
docker pull nginx
docker pull nginx:latest
查看本地镜像
docker images
移除镜像
需要把容器先删除
# 先移除容器docker rm -f 容器id
docker rmi 镜像名
# 删除所有<none>------反复build导致的
docker rmi `docker images | grep '<none>' | awk '{print $3}'`
创建容器,运行容器
# 创建容器,运行容器,后台运行,端口映射,命名
docker run -d -p 80:80 nginx
- # run
- -d
- -dit
- --link 域名 --link(容器互联)官方不建议使用,推荐network。
- -p 80:80
- --name mynginx
- -v `pwd`:/路径
- 镜像名:latest
----------------------------
数据管理(未完)
1. 数据卷
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 卷会一直存在,直到没有容器使用 *数据卷的使用,类似于 Linux 下对目录或文件进行 mount。
创建一个数据卷
在用 docker run 命令的时候,使用 -v 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷。创建一个 web 容器,并加载一个数据卷到容器的 /webapp 目录。
docker run -d -P --name web -v /webapp training/webapp python app.py
挂载一个主机目录作为数据卷
挂载一个本地主机文件作为数据卷
2. 数据卷容器
如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。
数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
3. 利用数据卷容器来备份、恢复、迁移数据卷
网络
----------------------------
停止容器
# 创建容器之后,停止nginx02容器
docker stop 容器id
# 启动已存在容器nginx02
docker start 容器id
查看容器
docker ps
进入容器
# bash进入容器
docker exec -it 容器id bash
# 退出容器
exit
查看并修改文件
# 查看当前路径文件
ls
# 查看网页内容
cat index.html
# 修改
echo hello,docker > index.html
移除容器
# 删除容器
docker rm -f 容器id
----------------------------------
从容器创建一个新的镜像
docker commit 容器id 镜像名字
报错
# 原因:需要先有容器id,不能随便写数
Error response from daemon: No such container: 92
启动容器
docker run -d -p 90:80 m1
通过Dockerfile建立镜像跑容器
Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。
一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
1.建立Dockerfile文件
vim Dockerfile
# FROM nginx
# ADD ./ /usr/share/nginx/html/
2.编写外部文件
vim index.html
# dockerfile is this
3.构建镜像
# m2是容器名,点表示当前目录下寻找Dockerfile文件去构建镜像
docker build -t m2 .
4.跑容器
docker run -d -p 100:80 m2
save构建镜像
1.存出镜像
docker save m2 >1.tar
2.载入镜像
docker load < 1.tar
使用docker load的时候会出现如下错误
open /var/lib/docker/tmp/docker-import-3061451168/repositories: no such file or directory
解决方法
cat 1.tar|sudo docker import - 镜像名
组织多容器的一个多容器项目docker-compose
link映射
# 启动容器
docker run -d -p 80:80 --name mynginx nginx
# 查看容器
docker ps
# 进入容器
docker exec -it mynginx bash
# 查看网络配置ip
cat /etc/hosts
# linux系统
docker run -dit alpine
# 进入容器
docker exec -it xxxx(容器id)
# 下载curl用来请求 Web 服务器
apk add curl
#请求
curl 172.17.0.2
设置域名(其他步骤一致)
从下往上写,用link进行映射
这样对运维来说太麻烦了,有什么好方法吗?docker-compose
docker-compose
按照nginx -> php -> mysql实现
项目结构
hello-docker-compose
|-- conf
|-- nginx.conf // nginx配置文件
|-- html
|-- index.html // nginx首页
|-- test.php // 访问 php info服务
|-- mysql.php // 访问 mysql
|-- docker-compose.yml // docker-compose 主配置文件
nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
include fastcgi_params;
}
}
}
index.html
hello docker-compose !
test.php
<?php
$dbhost = 'mysql';
$dbuser = 'root';
$dbpass = '123456';
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if (!$conn) {
die('could not connect! ' . mysqi_error());
}
echo 'connect success! ';
mysqli_close($conn);
?>
mysql.php
<?php
phpinfo();
?>
docker-compose.yml
version: "3"
services:
nginx:
image: nginx:alpine
ports:
- 80:80
volumes:
- ./html:/usr/share/nginx/html
- ./conf/nginx.conf:/etc/nginx/nginx.conf
php:
image: devilbox/php-fpm:8.0-work-0.106
volumes:
- ./html:/var/www/html
mysql:
image: mysql:5.6
environment:
- MYSQL_ROOT_PASSWORD=123456