名词 镜像: docker的本质是进程,可以理解为进程文件, 可以在同一个物理机上,使用一个docker image启动多个容器,每个容器第一次启动的时候会有一个容器id,以后使用这个id启动就可以了
查看当前机器的所有image(repositories.json文件中记录了image的一些信息):
docker images
删除image: docker rmi image的id
查找镜像: docker search drone(镜像名称关键字), 注意名称有的格式如: 有的是drone/drone,其中drone/drone和drone是不一样的
如何查看容器的日志(停止原因) docker logs 容器id
1.安装
sudo systemctl start docker (系统重启后也要先启动docker服务进程)
systemctl enable docker 设置开机启动
https://www.linuxidc.com/Linux/2019-08/160208.htm
最早的时候docker就是一个开源项目,主要由docker公司维护,moby是继承了原先的docker的项目,是社区维护的的开源项目,谁都可以在moby的基础打造自己的容器产品。docker-ce是docker公司维护的开源项目,是一个基于moby项目的免费的容器产品
docker-ee是docker公司维护的闭源产品,是docker公司的商业产品。
2.下载镜像
因为墙,所以还是从国内镜像站点下载吧,比如网易
docker pull hub.c.163.com/library/nginx:latest
设置镜像源
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}或者阿里镜像源
{
"registry-mirrors": ["https://iy84qjok.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"insecure-registries": ["192.168.91.137"]
}
systemctl restart docker.service
3.常用命令
docker ps // 查看所有正在运行容器
docker stop containerId // containerId 是容器的ID
docker start containerId //启动docker
如 sudo docker run -i -t ubuntu /bin/bash
后面的 bin/bash什么意思呢? 这是表示载入容器后运行bash ,docker中必须要保持一个进程的运行,要不然整个容器就会退出。
这个就表示启动容器后启动bash。
/bin/bash是表示启动容器后运行的进程,我们下载的镜像,有时候目标进程并不是开机自动启动的
sudo docker run -i -t consul consul agent -dev
docker exec -ti -u root 4650e8d1bcca bash 以root身份进入docker
docker ps -a // 查看所有容器
docker ps -a -q // 查看所有容器ID
删除镜像 docker rmi imagename
删除容器 docker rm 容器id
docker stop $(docker ps -a -q) // stop停止所有容器
docker rm $(docker ps -a -q) // remove删除所有容器
sudo docker rm $(sudo docker ps -qf status=exited) //删除exited状态的容器
docker container update --restart=always 容器名/容器id //修改成开机自动重启
清理停止的docker, 安全起见,这个命令默认不会删除那些未被任何容器引用的数据卷,如果需要同时删除这些数据卷,你需要显式的指定 --volumns 参数。比如你可能想要执行下面的命令:
$ docker system prune --all --force --volumns
这次不仅会删除数据卷,而且连确认的过程都没有了!
查看容器运行日志 docker logs-查看docker容器日志
3.启动、进入容器
启动容器 docker run -d -it -p 8080:80 hub.c.163.com/library/nginx
docker exec -it 775c7c9ee1e1 /bin/bash (/bin/bash不行的时候就试试/bin/sh)
以root身份进入docker: docker run -d -it -u root 775c7c9ee1e1 /bin/bash
容器安装工具
4.创建镜像
如果创建镜像的时候没有指定镜像名称,可以可以使用命令:
docker tag [image id] [name]:[版本]
5.查看镜像的详细信息 docker inspect containerId
返回的json中包含镜像的ip地址,gateway网关,Args和HostConfig属性里可以找到容器当初的启动参数
env 包含了启动的环境变量设置
6.docker连外网/设置固定ip
sudo docker network create --subnet=172.18.0.0/24 staticnet
查看docker容器ip地址 docker inspect --format='{{.NetworkSettings.IPAddress}}' 镜像名称,如postgres
查看所有容器的ip地址:
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
已经创建了映射,但是外网无法访问端口解决办法:
# vi /etc/sysctl.conf
或者
# vi /usr/lib/sysctl.d/00-system.conf
添加如下代码:
net.ipv4.ip_forward=1 #0-不允许转发 1-允许转发 默认0
service network restart
7.docker快速扩展的一个重要特征就是stateless,具有数据状态的都不适合直接放在docker里面,因为如果docker中安装数据库,存储需要单独作为一个数据服务进行提供。目前腾讯的TDSQL和阿里的Oceanbase都直接运行中在物理机器上,都没使用docker。
8.修改容器启动参数
先查看容器的镜像完整id, 这个id下放了容器相关的文件,"Id": "5328d8acde1c0314c6b5e44a63b21d4a1da456df9d02553fa489c1af45c77b77",
对应的目录是: /var/lib/docker/containers/5328d8acde1c0314c6b5e44a63b21d4a1da456df9d02553fa489c1af45c77b77/
修改了这个 config.v2.json文件的env 参数但是重启后,又被覆盖了,这是因为修改之前,一定要先停止docker服务
9.创建镜像
方式1: 下载一个centos镜像,
使用docker cp 将文件拷贝到container的目标文件夹下: docker cp ser e23a95e8a511:/alidata
docker commit -m "注释" e23a95e8a511 新镜像名称
镜像中的进程如果要启动后自动运行,还是要写一个启动shell脚本放到 /etc/profile.d/ 中
在镜像中做了操作,如果要保存,可以重新commit,然后运行新的镜像
方法2: 使用Dockerfile
如创建一个能编译golang代码,在go的工程目录下
#源镜像
FROM golang:latest
#作者
MAINTAINER fish "3232937716@qq.com"
#设置工作目录
WORKDIR $GOPATH/src/nginx-go
#将服务器的go工程代码加入到docker容器中
ADD . $GOPATH/src/nginx-go
#go构建可执行文件
RUN go build .
#暴露端口
EXPOSE 6064
#最终运行docker的命令
ENTRYPOINT ["./nginx-go"]
执行docker build -t nginx-go:1 .
10.docker中安装软件(无法使用vim)
apt-get update
apt-get install vim -y
apt-get install yum -y
apt-get install net-tools
11. harbor
停止: 在harbor所在的目录 docker-compose stop
开始 : 在harbor所在的目录 docker-compose start
docker 默认是按 https 请求的,由于我搭的私有库是 http 的,所以需要修改 docker 配置,修改为本机的ip,否则外部访问不了harbor的UI
修改 /etc/docker/daemon.json 添加下列信息,"insecure-registries": ["192.168.91.128"]
登录密码,数据库登录密码等在配置文件 harbor.cfg中,默认的web登录账号 admin/ Harbor12345
打tag 其中kubevirt是harbor中创建的仓库名称, mysql是本地下载的一个docker镜像,
docker tag mysql 192.168.91.128/kubevirt/xiaoyu_sql:0.0.1 (其中kubevirt是仓库名)
docker push 192.168.91.128/kubevirt/xiaoyu_sql:0.0.1
不带版本号0.0.1的话,tag就是latest, 删除的时候直接 docker rmi mysql 192.168.91.128/kubevirt/xiaoyu_sql, 否则要 mysql 192.168.91.128/kubevirt/xiaoyu_sql:0.0.1
拉取镜像 docker pull 192.168.91.128/kubevirt/xiaoyu_sql:0.0.1, 如果tag是latest,会报错 .........not found: manifest unknown: manifest unknown
docker pull 192.168.91.128/kubevirt/xiaoyu_sql:0.0.1:latest
如果修改了harbor.cfg文件,需要重新,否则其他 docker中的配置还是旧的
- 修改完配置文件后,运行
./prepare
,它会哪所配置文件修改一文件 - 运行
./install.sh
12. python项目Dockerfile
代码在myapp目录下,myapp和Dockerfile在同一级目录
#!/usr/bin/env python
#coding=utf-8
import logging
import time
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
datefmt = '%Y-%m-%d %H:%M:%S',
filename='myapp.log',
filemode='w')
# 定义一个Handler打印INFO及以上级别的日志到sys.stderr
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# 设置日志打印格式
formatter = logging.Formatter('%(asctime)s %(name)-12s: %(levelname)-8s %(message)s')
console.setFormatter(formatter)
# 将定义好的console日志handler添加到root logger
logging.getLogger('').addHandler(console)
if __name__ == '__main__':
print('start.........')
while True:
time.sleep(3)
#print('test.........')
logging.info('test.........')
#基于的基础镜像
FROM python:2.7
#代码添加到code文件夹
ADD ./myapp /code
# 设置code文件夹是工作目录
WORKDIR /code
# 安装支持
RUN pip install -r requirements.txt
CMD ["python", "/code/test.py"]
13. --link
使用link链接的docker之间,可以使用域名直接ping通,会在/ets/hosts文件中添加路由