Docker
1.安装步骤(Ubuntu):
首先检查主机内核(版本要高于3.10):
uname -r
安装docker:
sudo apt-get install -y docker.io
(sudo su 切换到root用户操作)
验证docker是否启动
systemctl status docker
启动docker:
systemctl start docker
开机启动docker
systemctl enable docker
启动的配置文件在 /etc/default/docker
查看docker是否已经启动
ps aux | grep docker
查看镜像:
docker images
下载镜像(有网的情况,去镜像库中下载)
docker pull [镜像]
切换阿里云镜像
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://j7itktkw.mirror.aliyuncs.com"]
}
EOF
#重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
###此步(修改为阿里云镜像)还可以用vim命令写入
vi /etc/docker/daemon.json
然后跳转到编辑页面
插入
{
"registry-mirrors": ["https://j7itktkw.mirror.aliyuncs.com"]
}
注释: vim编辑页面保存退出:
首先 按esc --》再输入冒号 : 然后 输入 q 退出
或者 按了ESC后,直接按shift+zz,或者切换到大写模式按ZZ,就可以保存退出了, 即是按2次大写的Z。
#查看文件
cat /etc/docker/daemon.json
创建docker用户(Ubuntu自己yoghurt不能操作daocker)
sudo usermod -a -G docker [用户名]
切换到docker用户名下
sudo su -l [用户名]
2.镜像
运行hello-word 这个镜像(如果镜像不存在,就从云镜像中找,并下载且运行)
docker run hello-world
列出已经下载的镜像
docker image ls
(同上 docker images
)
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
移除镜像
docker image rm <image id>
# Remove specified image from this machine
docker image rm $(docker image ls -a -q)
# Remove all images from this machine
创建镜像:
前提:必须有建镜像的配置文件,进入(cd)配置文件(Dockerfile)的同级目录下。
docker build --tag= [镜像名]:[版本号] .
docker build -t= [镜像名]:[版本号] .
例:创建friendlyhello容器版本v0.0.1
docker build --tag=friendlyhello:v0.0.1 .
docker build -t=friendlyhello:v0.0.1 .
注:tag前边是两个“-”,t前边是一个“-”。 命令后有一个英文的句号“.”。
-t :指定要创建的目标镜像名 . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
Dockerfile文件创建镜像(官网的一个小例子)
Dockerfile 中的主要标签
- FROM image的来源
- WORKDIR 指定工作路径
- COPY . /app 将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。
- RUN 生成image是执行。可以包含多个RUN命令
- EXPOSE 80 将容器 80 端口暴露出来, 允许外部连接这个端口。如不指定会随机指 定一个端口
- ENV 定义环境
- CMD 运行容器的时候执行。只能有一个。
其中配置文件Dockerfile ,app.py,requirements.txt
Dockerfile文件
# Use an official Python runtime as a parent image
FROM python:2.7-slim
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
COPY . /app
# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# Make port 80 available to the world outside this container
EXPOSE 80
# Define environment variable
ENV NAME World
# Run app.py when the container launches
CMD ["python", "app.py"]
from flask import Flask
from redis import Redis, RedisError
import os
import socket
# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
app = Flask(__name__)
@app.route("/")
def hello():
try:
visits = redis.incr("counter")
except RedisError:
visits = "<i>cannot connect to Redis, counter disabled</i>"
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Visits:</b> {visits}"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
requirements.txt
Flask
Redis
生成镜像,以上三个文件全部放在同一个文件目录下,进入文件的工作目录
运行 docker build -t=friendlyhello .
生成friendlyhello镜像,
运行镜像
dockers run -p 4000:80 friendlyhello
浏览打开网址
http://localhost:4000
3 容器
运行image生成container:
docker run [镜像名]
例:
dockers run -p 4000:80 friendlyhello
注 (1)4000是本地机器链接的端口,此接口可以根据本地机器空闲端口选择;
80是docker内部和本地链接的端口,在配置文件中已经写好。
(2)docker run -d -p 4000:80 [镜像名]
此命令行和上句作用一样,运行容器后返回运行容器id被踢出退回终端,容器正常运行。 还可以指定登录ip
docker run -d -p 127.1.1.1:4000:80 [镜像名]
(3)查看正在运行的容器
docker ps docker container ls docker container ls -a
列出所有的容器列表
docker container ls -a -q
列出所有容器的ID(只有运行过的容器ID就会存在)
docker container ls --all
列出容器的状态信息
(4)移除容器
docker container rm [容器id/容器名]
只能移除已经运行结束的容器,
docker container rm [容器id1/容器名1] [容器id2/容器名2] …
上句等同于docker container rm $(docker container ls -a > -q)
(5)查看容器的端口
docker container port [容器id/容器名]
正在运行的容器
docker container top [容器id/容器名]
查看容器进行
(6)查看 Docker 的底层信息,返回一个 JSON 文件记录着 Docker 容器的配置和状态信息docker inspect [容器id/容器名]
停止正在运行的容器:
docker container stop [容器id/容器名]
docker container kill [容器id/容器名] 暴力杀死此容器
docker exec来进入到到该容器中,或者attach重新连接容器的会话
docker exec [containerID]
启动容器
docker container start [containerID]
查询正在运行的容器命令:docker container ls
查看容器输出
docker container logs [containerID]
拷贝正在运行容器的文件到本地主机的指定目录
docker container cp [containID]:[/path/to/file] .
镜像变成容器
docker commit <container> [repo:tag]
登录docker官网镜像
docker login
注: 输入账户和密码
账户:自己注册的账户
密码:自己的
镜像的上传
上传image
1 生成标签tag
docker tag image username/repository:tag
例如:docker tag friendlyhello zhangkang1228/first:n1
2 上传
docker push username/repository:tag
例如:docker push zhaokang1228/first:n1
查找镜像(镜像库中网上)
docker search 镜像名
例如: docker search httpd
NAME:镜像仓库源的名称
DESCRIPTION:镜像的描述
OFFICIAL:是否docker官方发布
列出stacks或者apps
docker stack ls
# List stacks or apps
启动stack通过compose文件
docker stack deploy -c <composefile> <appname> # Run the specified Compose file
例子: docker stack deploy -c docker_compose.yml getstartlab
其中docker-copmose.yml是compose文件
getstartlab 是app名
[注],如果运行后重新执行是更新对应名字的app
docker service ls # List running services associated with an app
docker service ps <service> # List tasks associated with an app
检查任务或者容器
docker inspect <task or container> # Inspect task or container
docker container ls -q # List container IDs
docker stack rm <appname> # Tear down an application
docker swarm leave --force # Take down a single node swarm from the manager
4 本地镜像下载导入
镜像(image)下载:(自己的docker,在没有网络的情况下,用于U盘传输)
docker save [容器id]> /path/文件名.tar
例如:docker save eb40dcf64078> /home/kaka/mydjango-save-1016.tar
镜像(image)加载到本地docker
docker load < /path/文件名.tar
例:docker load < /home/kaka/mydjango-save-1016.tar
docker image ls 后发现镜像(image)仓库源和版本都为空
用docker tag [镜像id] 镜像名:版本号