在测试或开发环境中,Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,执行这个脚本后就会自动地将一切准备工作做好,并且把 Docker 的稳定版本安装在系统中。
curl -fsSL get.docker.com -o get-docker.sh
执行后出现脚本。
sh get-docker.sh --mirror Aliyun
错误1:
Package: docker-ce-rootless-extras-20.10.6-3.el7.x86_64 (docker-ce-stable)
Requires: slirp4netns >= 0.4
解决方式:
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum -y install docker-ce
执行启动指令:
service docker start
查看启动进程:
ps -ef|grep docker
检查安装结果
docker info
推荐设置开机自启,执行指令:
systemctl enable docker
创建或修改 /etc/docker/daemon.json 文件,修改为如下形式
vim /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]",graph":"/data/dockerinstall"
}
重新启动docker
service docker restart
再次查询docker启动信息。配置成功!
docker info
Docker中国区官方镜像 https://registry.docker-cn.com
网易 http://hub-mirror.c.163.com
ustc https://docker.mirrors.ustc.edu.cn
中国科技大学 https://docker.mirrors.ustc.edu.cn
阿里云容器 https://cr.console.aliyun.com/(收费)
镜像就是一个只读的模板,镜像可以用来创建 Docker 容器,一个镜像可以创建多个容器
容器是用镜像创建的运行实例,Docker 利用容器独立运行一个或一组应用。它可以被启动、开始、停止、删除,每个容器都是相互隔离的、保证安全的平台。可以把容器看作是一个简易的 Linux 环境和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的
仓库是集中存放镜像文件的场所。仓库和仓库注册服务器是有区别的,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签。仓库分为公开仓库和私有仓库两种形式,最大的公开仓库是 DockerHub,存放了数量庞大的镜像供用户下载,国内的公开仓库有阿里云、网易云等。
通俗点说,一个镜像就代表一个软件;而基于某个镜像运行就是生成一个程序实例,这个程序实例就是容器;而仓库是用来存储 Docker 中所有镜像的。
其中仓库又分为远程仓库和本地仓库,和 Maven 类似,倘若每次都从远程下载依赖,则会大大降低效率,为此,Maven 的策略是第一次访问依赖时,将其下载到本地仓库,第二次、第三次使用时直接用本地仓库的依赖即可,Docker 的远程仓库和本地仓库的作用也是类似的。
安装部署好Dokcer后,执行的命令是docker开头
总的来说分为以下几种:
docker [run|start|stop|restart|kill|rm|pause|unpause]
docker [ps|inspect|top|attach|events|logs|wait|export|port]
docker [commit|cp|diff]
docker [login|pull|push|search]
docker [images|rmi|tag|build|history|save|import]
docker search 镜像名称
docker images
其中REPOSITORY为镜像名,TAG为版本标志,IMAGE ID为镜像 id(唯一的),CREATED为创建时间,注意这个时间并不是我们将镜像下载到 Docker 中的时间,而是镜像创建者创建的时间,SIZE为镜像大小。
docker images mysql
docker pull image_name
docker pull image_name:tag
image_name:表示镜像的仓库源名称。
TAG:镜像的标签 如果不指定tag 那么默认用最新的
docker rmi 镜像名称/镜像ID
docker rmi -f 镜像名称/镜像ID
#强制删除 如果镜像有容器在运行 那么就需要强制删除 增加 -f 参数
举例:
#搜索所有nginx相关的镜像列表(模糊查询)
docker search nginx
#拉取nginx镜像
docker pull nginx
#拉取tag为stable的nginx
docker pull nginx:stable
通过查看镜像 会发现是有两个nginx镜像 ,不过他们版本不一样。
#首先会从本地找镜像,如果有则直接启动,没有的话,从镜像仓库拉起,再启动)
docker run
#-d 后台运行
#-p 端口映射 (可以有多个 因为该镜像可能存在多个端口)
#rabbitmq:management (格式 REPOSITORY:TAG),如果不指定tag,默认使用最新的
#–name 给该容器取个名字
#-v 挂卷模式 本机目录:服务器目录。
用于映射容器及本机文件夹。映射后本机的目录修改会自动同步到容器中。
例如/data/mysql_data:/usr/local/mysql/data
其中本机目录可以自定义名称,Docker 会为自动创建一个名为自定义名称的数据卷,并且会将容器内webapps目录下的所有内容复制到数据卷中,该数据卷的位置在docker/volumes目录下。
docker run -d --name "xinaotestmysql" -p 3306:3306 mysql:5.6.20
运行容器后 我们可以直接访问rabbitmq 这就是Docker带来的方便。
docker run -d --name "xinaotestmysql" -p 3306:3306 mysql:5.6.20
docker ps -a
其中CONTAINER_ID为容器的 id,IMAGE为镜像名,COMMAND为容器内执行的命令,CREATED为容器的创建时间,STATUS为容器的状态,PORTS为容器内服务监听的端口,NAMES为容器的名称。
检查容器内部信息(重要)
docker inspect 容器ID
docker stop 容器ID
docker start 容器ID
docker logs 容器ID
这样的方式显示的日志并不是实时的,若是想实时显示,需要使用-f参数:
docker -f logs 容器ID
通过-t参数还能够显示日志的时间戳,通常与-f参数联合使用:
docker logs -ft 容器ID
docker rm 容器ID (容器必须是停止状态)
docker top 容器ID
docker exec -it 容器ID bash
此时终端将会进入容器内部,执行的指令都将在容器中生效,在容器内只能执行一些比较简单的指令,如:ls、cd 等,若是想退出容器终端,重新回到 CentOS 中,则执行exit即可。
docker cp ./test.html 289cc00dc5ed:/usr/local/mysql
通过docker cp指令能够将文件从 CentOS 复制到容器中,./test.html为 CentOS 中的资源路径,289cc00dc5ed为容器 id,/usr/local/mysql为容器的资源路径,此时test.html文件将会被复制到该路径下。
若是想将容器内的文件复制到 CentOS 中,则反过来写即可:
docker cp 289cc00dc5ed:/usr/local/tomcat/webapps/test.html ./
所以现在若是想要部署项目,则先将项目上传到 CentOS,然后将项目从 CentOS 复制到容器内,此时启动容器即可。
重要,核心功能,一次部署到处使用
docker commit -m "描述信息" -a "镜像作者" xinaotestmysql mysql:1.0
docker save -o 要打包的文件名.tar mysql:1.0
docker load -i mysql.tar
docker pull mysql:5.7
docker images|grep mysql
建议在/usr/local/workspace/mysql下执行以下docker run命令
docker run -p 3306:3306 --name my-mysql -v $PWD/conf:/etc/mysql -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6.20
建议写死路径,使用如下命令:
docker run -p 3306:3306 --name testmysql -v /data/zkr-delpoy/mysql:/data/zkr-delpoy/mysql -v/etc/mysql:/etc/mysql -e MYSQL_ROOT_PASSWORD=testpassword -d mysql:5.7
命令说明:
将容器的 3306 端口映射到主机的 3306 端口
-p 3306:3306
启动后容器名为 my-mysql
–name my-mysql
将主机当前目录下的 conf/ 挂载到容器的 /etc/mysql(conf目录为mysql的配置文件,不挂载也没问题)
-v $PWD/conf:/etc/mysql
将主机当前目录下的 logs 目录挂载到容器的 /logs(logs目录为mysql的日志目录,不挂载也没影响)
-v $PWD/logs:/logs
将主机当前目录下的data目录挂载到容器的 /var/lib/mysql (data目录为mysql配置的数据文件存放路径,这个还是建议挂载,是存储数据的,容器down掉,还能再次挂载数据。)
-v $PWD/data:/var/lib/mysql
初始化 root 用户的密码
-e MYSQL_ROOT_PASSWORD=123456
查看进程:
docker ps -a
查看日志:
docker logs 6dbc2420d61c
出现如下日志则启动成功!
进入容器mysql:
docker exec -it my-mysql bash
使用如下命令安装:
apt-get update
apt-get install vim
因为数据源的原因替换国内的镜像源即可:
mv /etc/apt/sources.list /etc/apt/sources.list.bak && \echo "deb http://mirrors.aliyun.com/debian stretch main contrib non-free" >/etc/apt/sources.list && \echo "deb-src http://mirrors.aliyun.com/debian stretch main contrib non-free" >>/etc/apt/sources.list && \echo "deb http://mirrors.aliyun.com/debian stretch-updates main contrib non-free" >>/etc/apt/sources.list && \echo "deb-src http://mirrors.aliyun.com/debian stretch-updates main contrib non-free" >>/etc/apt/sources.list && \echo "deb http://mirrors.aliyun.com/debian-security stretch/updates main contrib non-free" >>/etc/apt/sources.list && \echo "deb-src http://mirrors.aliyun.com/debian-security stretch/updates main contrib non-free" >>/etc/apt/sources.list
再次下载安装vim即可:
apt-get update
apt-get install vim
进入docker容器后无法使用ll、mv等常用命令:
vim ~/.bashrc
保存,退出!
执行立即生效命令:
source ~/.bashrc
进入docker容器后无法使用ps命令:
apt-get update && apt-get install procps
docker中mysql重启或宕机数据会不会丢失?
使用本机挂机data目录方法不会丢失。无论是新创建容器或重启容器,只要保证挂载目录启动则必定不会丢失,同时建议保证mysql版本一致
其实生产比做的这个测试要复杂的多,mysql集群,主备,数据同步,网络等等问题,用docker解决确实为难,生产环境不建议使用docker装载mysql。
mysql容器的管理或者说有状态应用的管理还得一个比较流弊的东西,这个项目是大名鼎鼎的kubernetes。
FROM centos
MAINTAINER qyx
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----构建完成----"
CMD /bin/bash
CMD 替换
ENTRYPOINT 追加
docker build -f dockerfile-centos -t testcentos:0.1 .
-f 脚本路径 -t 镜像名称
docker history 镜像名
docker login -u用户名
docker tag 作者/镜像名[版本号]
docker push 作者/镜像名[版本号]
docker logout
docker network ls
docker network create 网络名称
docker network connec 网络名称 容器名称
docker network inspect 网络名称
执行:
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
链接:
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
赋权:
sudo chmod +x /usr/local/bin/docker-compose
执行:
docker-compose version
mkdir composetest
cd composetest
vim app.py
import time
import redisfrom flask import Flask
app = Flask(__name__)cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
flask
redis
创建Dockerfile
#syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /codeENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txtEXPOSE 5000
COPY . .
CMD ["flask", "run"]
version: "3.3"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
docker-compose build
docker-compose up (-d 后台启动)