Linux部署-docker

应用部署

下载docket

最快安装方法

在测试或开发环境中,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
Linux部署-docker_第1张图片

解决方式:

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum -y install docker-ce

安装成功!
Linux部署-docker_第2张图片

安装完成后直接启动服务

执行启动指令:

service docker start

查看启动进程:

ps -ef|grep docker

在这里插入图片描述

检查安装结果

docker info

Linux部署-docker_第3张图片

推荐设置开机自启,执行指令:

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

Linux部署-docker_第4张图片

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/(收费)

简单了解docket

核心概念:

镜像

镜像就是一个只读的模板,镜像可以用来创建 Docker 容器,一个镜像可以创建多个容器
容器是用镜像创建的运行实例,Docker 利用容器独立运行一个或一组应用。它可以被启动、开始、停止、删除,每个容器都是相互隔离的、保证安全的平台。可以把容器看作是一个简易的 Linux 环境和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的

仓库

仓库是集中存放镜像文件的场所。仓库和仓库注册服务器是有区别的,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签。仓库分为公开仓库和私有仓库两种形式,最大的公开仓库是 DockerHub,存放了数量庞大的镜像供用户下载,国内的公开仓库有阿里云、网易云等。
通俗点说,一个镜像就代表一个软件;而基于某个镜像运行就是生成一个程序实例,这个程序实例就是容器;而仓库是用来存储 Docker 中所有镜像的。
其中仓库又分为远程仓库和本地仓库,和 Maven 类似,倘若每次都从远程下载依赖,则会大大降低效率,为此,Maven 的策略是第一次访问依赖时,将其下载到本地仓库,第二次、第三次使用时直接用本地仓库的依赖即可,Docker 的远程仓库和本地仓库的作用也是类似的。

docket常用命令

安装部署好Dokcer后,执行的命令是docker开头
总的来说分为以下几种:

容器生命周期管理

docker [run|start|stop|restart|kill|rm|pause|unpause]

容器操作运维

docker [ps|inspect|top|attach|events|logs|wait|export|port]

容器rootfs命令

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镜像 ,不过他们版本不一样。
在这里插入图片描述

镜像下载的位置及对应的映射关系
Linux部署-docker_第5张图片
Linux部署-docker_第6张图片

容器命令

运行容器

#首先会从本地找镜像,如果有则直接启动,没有的话,从镜像仓库拉起,再启动)

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

Linux部署-docker_第7张图片

停止某个容器
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

Linux部署-docker_第8张图片

加载镜像到docker
docker load -i mysql.tar

Linux部署-docker_第9张图片

docket部署mysql

下载镜像

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
出现如下日志则启动成功!
Linux部署-docker_第10张图片

配置mysql

进入容器mysql:

 docker exec -it my-mysql bash

在这里插入图片描述

其余问题

进入docker容器后无法使用vi或vim命令
在这里插入图片描述

使用如下命令安装:

apt-get update
apt-get install vim

使用命令出下如下错误:
Linux部署-docker_第11张图片

因为数据源的原因替换国内的镜像源即可:

更新apt-get源

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

Linux部署-docker_第12张图片

保存,退出!
执行立即生效命令:

source ~/.bashrc

进入docker容器后无法使用ps命令:

apt-get update && apt-get install procps

docker中mysql重启或宕机数据会不会丢失?
使用本机挂机data目录方法不会丢失。无论是新创建容器或重启容器,只要保证挂载目录启动则必定不会丢失,同时建议保证mysql版本一致
其实生产比做的这个测试要复杂的多,mysql集群,主备,数据同步,网络等等问题,用docker解决确实为难,生产环境不建议使用docker装载mysql。
mysql容器的管理或者说有状态应用的管理还得一个比较流弊的东西,这个项目是大名鼎鼎的kubernetes。

docketfile

编写脚本

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

docket网络

查看网络

docker network ls

创建网络

docker network create 网络名称

容器连接网络

docker network connec 网络名称 容器名称

查看网络信息

docker network inspect 网络名称

docket compose

安装

执行:

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

demo

创建文件夹:
 mkdir composetest
 cd composetest
创建app.py
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)

创建requirements.txt
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"]
创建docker-compose.yml
version: "3.3"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"
执行编译:
docker-compose build
docker-compose up (-d 后台启动)

Linux部署-docker_第13张图片

Linux部署-docker_第14张图片

你可能感兴趣的:(linux部署,docker,linux)