Docker 学习
入门docker看阮一峰老师的两篇就入门了,这里做下笔记
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
http://www.ruanyifeng.com/blog/2018/02/docker-wordpress-tutorial.html
虚拟机的缺点
虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。
虽然用户可以通过虚拟机还原软件的原始环境。但是,这个方案有几个缺点。
(1)资源占用多
虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。
(2)冗余步骤多
虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。
(3)启动慢
启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。
容器优点
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
由于容器是进程级别的,相比虚拟机有很多优势。
(1)启动快
容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。
(2)资源占用少
容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。
(3)体积小
容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。
总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。
Docker 用途
Docker 的主要用途,目前有三大类。
(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
Ubuntu docker安装
sudo apt-get install -y telnet gcc make vim net-tools tree rar aptitude manpages-posix-dev libltdl3-dev lrzsz bridge-utils ipvsadm openssh-server ipvsadm git sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common sudo curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" sudo apt-cache policy docker-ce sudo apt-get install -y docker-ce docker version sudo systemctl start docker sudo systemctl enable docker sudo vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://o68hnxvo.mirror.aliyuncs.com"]
}
sudo systemctl daemon-reload sudo systemctl restart docker ps -ef| grep docker| grep -v grep docker-compose version # install go-land wget https://dl.google.com/go/go1.11.6.linux-amd64.tar.gz sudo tar -zxvf go1.11.6.linux-amd64.tar.gz -C /usr/local/ mkdir $HOME/go go env
vim /etc/profile
export GOROOT="/usr/local/go"
export GOPATH="$HOME/go"
export GOBIN="$HOME/go/bin"
export PATH="$PATH:$GOROOT/bin:$GOPATH/bin"
export NODEJS_HOME="/usr/local/node-v8.11.4-linux-x64"
export PATH="$PATH:$NODEJS_HOME/bin"
# install hyperledger mkdir hyperledger && cd hyperledger git clone https://github.com/hyperledger/fabric-samples.git curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s 1.4.1 1.4.1 0.4.15
Docker概念:
0x00 微服务,服务模块化
0x01 image相当于类, container 相当于对象,可自定义镜像
0x02 类似github,可以登录push 和 pull
0x03 可以映射端口和目录到本地,docker使用局域网IP
0x04 超低开销,性能优,启动快
Docker 常用命令
docker ps -a 查看容器状态
docker container
ls 查看容器 run 新开一个容器 start 打开已有容器 stop 关闭容器 rm 删除容器 stats 运行状态 port 查看端口映射 commit 提交变化到镜像 cp 在容器和本机之间拷贝文件 kill 杀死容器 logs 查看容器输出 diff 检查容器文件变化 exec 在容器上执行命令 inspect 容器详情 top 查看容器运行进程 prune 移除所有暂停的容器 export 导出容器文件系统为压缩包
docker container run 常用参数-d 后台运行
--rm 一次性容器 --it 指定镜像 -p 端口映射 8080:80 -name 容器名 --volume 文件映射 --env USERNMAE=root 设置容器环境变量
--link wordpress-mysql:mysql 连接其他容器
--ite 交互式状态
image:tag
/etc/bash
https://www.jb51.net/article/154031.htm
docker image
build 构建一个镜像 history 查看镜像历史 import 导入创建镜像 inspect 查看镜像详情 load 从压缩包或者标准输入中加载镜像 ls 查看所有镜像 prune 移除未使用的镜像 pull 拉取个人镜像 push 推送个人镜像 rm 删除镜像 save 保存镜像到压缩包 tag 为镜像打标签
编写 Dockerfile 文件
.dockerignore
.git
node_modules
npm-debug.log
不打包进入 image 的文件
Dockerfile
FROM node:8.4 COPY . /app WORKDIR /app RUN npm install --registry=https://registry.npm.taobao.org EXPOSE 3000
ROM node:8.4
:该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4
,即8.4版本的 node。COPY . /app
:将当前目录下的所有文件(除了.dockerignore
排除的路径),都拷贝进入 image 文件的/app
目录。WORKDIR /app
:指定接下来的工作路径为/app
。RUN npm install
:在/app
目录下,运行npm install
命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。EXPOSE 3000
:将容器 3000 端口暴露出来, 允许外部连接这个端口。
docker image build -t koa-demo .
10.5 发布 image 文件
容器运行成功后,就确认了 image 文件的有效性。这时,我们就可以考虑把 image 文件分享到网上,让其他人使用。
首先,去 hub.docker.com 或 cloud.docker.com 注册一个账户。然后,用下面的命令登录。
$ docker login
接着,为本地的 image 标注用户名和版本。
$ docker image tag [imageName] [username]/[repository]:[tag] # 实例 $ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1
也可以不标注用户名,重新构建一下 image 文件。
$ docker image build -t [username]/[repository]:[tag] .
最后,发布 image 文件。
$ docker image push [username]/[repository]:[tag]
发布成功以后,登录 hub.docker.com,就可以看到已经发布的 image 文件。
(1)docker container start
前面的docker container run
命令是新建容器,每运行一次,就会新建一个容器。同样的命令运行两次,就会生成两个一模一样的容器文件。如果希望重复使用容器,就要使用docker container start
命令,它用来启动已经生成、已经停止运行的容器文件。
$ docker container start [containerID]
(2)docker container stop
前面的docker container kill
命令终止容器运行,相当于向容器里面的主进程发出 SIGKILL 信号。而docker container stop
命令也是用来终止容器运行,相当于向容器里面的主进程发出 SIGTERM 信号,然后过一段时间再发出 SIGKILL 信号。
$ bash container stop [containerID]
这两个信号的差别是,应用程序收到 SIGTERM 信号以后,可以自行进行收尾清理工作,但也可以不理会这个信号。如果收到 SIGKILL 信号,就会强行立即终止,那些正在进行中的操作会全部丢失。
(3)docker container logs
docker container logs
命令用来查看 docker 容器的输出,即容器里面 Shell 的标准输出。如果docker run
命令运行容器的时候,没有使用-it
参数,就要用这个命令查看输出。
$ docker container logs [containerID]
(4)docker container exec
docker container exec
命令用于进入一个正在运行的 docker 容器。如果docker run
命令运行容器的时候,没有使用-it
参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的 Shell 执行命令了。
$ docker container exec -it [containerID] /bin/bash
(5)docker container cp
docker container cp
命令用于从正在运行的 Docker 容器里面,将文件拷贝到本机。下面是拷贝到当前目录的写法。
$ docker container cp [containID]:[/path/to/file] .
4.2 Docker Compose 的安装
Mac 和 Windows 在安装 docker 的时候,会一起安装 docker compose。Linux 系统下的安装参考官方文档。
安装完成后,运行下面的命令。
$ docker-compose --version
4.3 WordPress 示例
在docker-demo
目录下,新建docker-compose.yml
文件,写入下面的内容。
mysql: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=123456 - MYSQL_DATABASE=wordpress web: image: wordpress links: - mysql environment: - WORDPRESS_DB_PASSWORD=123456 ports: - "127.0.0.3:8080:80" working_dir: /var/www/html volumes: - wordpress:/var/www/html
上面代码中,两个顶层标签表示有两个容器mysql
和web
。每个容器的具体设置,前面都已经讲解过了,还是挺容易理解的。
启动两个容器。
$ docker-compose up
浏览器访问 http://127.0.0.3:8080,应该就能看到 WordPress 的安装界面。
现在关闭两个容器。
$ docker-compose stop
关闭以后,这两个容器文件还是存在的,写在里面的数据不会丢失。下次启动的时候,还可以复用。下面的命令可以把这两个容器文件删除(容器必须已经停止运行)。
$ docker-compose rm