一、注意事项
(一)关于文章内容
- 命令行中()表示可选参数; <>表示变量
- 配置文件均放在了/home/<user>/.docker/
- 其他放在volume和其他位置
(二)几个目录
<volume>=/var/lib/docker/volumes/<volume>
<dst>=/var/lib/<dst>
(三)创建容器后排错
# 查看卷有没有创建
$ docker volume ls
# 查看库是否创建
$ ls /var/lib/docker/volums/<volume>/_data/
# 查看日志
$ docker logs <container>
# 查看绑定的端口
$ docker ps
二、docker相关官方网站
- Docker Hub
- Docker Hub
- Docker Doc
https://docs.docker.com](https://docs.docker.com/)
- 镜像
三、基础配置
(一)配置docker镜像下载仓库地址
1、编辑deamon.json
$ vi /etc/docker/deamon.json
{
"registry-missors": ["https://registry.docker-cn.com"]
}
2、重启docker
$ systemctl restart docker
四、命令行
(一)镜像(images)
1、删除镜像
# 删除某个
$ docker rmi <image>
# 删除所有
$ docker rmi $(docker images -q)
(二)容器(container)
常用
1、创建容器
# -i 交互式 -t 分配一个伪终端 -d 运行容器到后台
$ docker container run -itd - <container> <image>
2、删除容器
# 删除某个容器
$ docker rm -f <container-name>
$ docker volume rm <volume-name>
# 删除所有容器
$ docker rm -f $(docker ps -q -a)
$ docker volume rm -f $(docker volume ls)
3、进入容器的伪终端
$ docker exec -it <container-name> bash
4、查看所有容器
# 只看id
$ docker ps -q -a
# 查看所有信息
$ docker ps -a
5、启动容器
$ docker container start <container-name>
6、查看当前运行的容器
$ docker ps
$ docker container ls
7、进入容器
$ docker container attach <container-name>
8、拷贝文件到容器(不推荐使用)
$ docker container cp <file> <container-name>:<path>
$ docker container cp <container-name>:<path> <file>
(三)卷(volumes)
1、创建volume
$ docker volume create <volume>
2、列出所有volume
$ docker volume ls
3、查看某个volume
$ docker volume inspect <volume>
4、挂载volume到container
$ docker run -idt - <container> --mount src=<volume>,dst=<dst> <image>
5、清理
$ docker container stop <container>
$ docker container rm <container>
$ docker volume rm <volume>
6、验证绑定
$ docker inspect <container>
7、查看挂载目录
# 容器的
$ docker inspect --format "{{.Config.Volumes}}" <container>
# 宿主机的
$ docker inspect -f "{{.Mounts}}" <container>
(四)快速清理容器和卷
# 单个 例如 删除con-mysql 则 con=mysql
# $con="mysql"
$ con="nginx" \
&& docker container stop "con-"$con \
&& docker container rm "con-"$con \
&& docker volume rm "vol-"$con
# 所有
$ docker container stop $(docker ps -q -a) \
&& docker container rm $(docker ps -q -a) \
&& docker volume rm $(docker volume ls)
# 出现volume正在使用的话
$ sudo service docker stop
$ rm -rf /var/lib/docker/volumes/<volume>
$ sudo service docker start
五、Dockerfile
(一) Dockerfile的指令
1、FROM
构建的新镜像基于哪个镜像
# <image> centos:7 ubuntu:16.04
FROM <image>
2、MAINTAINER
镜像维护者姓名或邮箱地址
MAINTAINER <name>
3、RUN
构建镜像时运行的shell命令
# centos
RUN ["yum", "install", "httpd"]
# or
RUN yum install httpd
# ubuntu
RUN ["apt-get", "install", "httpd"]
# or
RUN apt-get install httpd
4、CMD
运行容器时执行的shell命令
CMD ["/usr/sbin/sshd", "-D"]
CMD /usr/sbin/sshd -D
5、EXPOSE
申明容器运行服务的端口
EXPOSE <port>
6、ENV
设置容器内环境变量
ENV MYSQL_ROOT_PASSWORD 123456
7、ADD
拷贝文件或者目录到镜像, 如果时URL或压缩包会自动下载或者解压
ADD <src> <dst>
ADD ["<src>", "<dst>"]
ADD https://xxx.xxx.xx/file.tar.gz /tmp/ # 不推荐
ADD /file.tar.gz /var/www/html
8、COPY
在宿主机和容器之间拷贝文件
COPY <src> <dst>
9、ENTRYPOINT
运行容器时执行的shell命令
可以将CMD的命令作为参数执行
ENTRYPOINT ["/bin/bash", "-c", "./start.sh"]
ENTRYPOINT /bin/bash -c ./start.sh
10、VOLUME
指定容器挂载点到宿主机自动生成的目录或其他容器
# 略
11、USER
为RUN、CMD、ENTRYPOINT执行命令指定运行用户
USER <user>[:<group>]
# or
USER <UID>[:GID]
12、WORKDIR
为RUN、CMD、ENTRYPOINT、COPY设置进入容器时默认的工作目录
WORKDIR /home/workspace
13、HEALTHCHECK
健康检查
# 略
14、ARG
构建镜像时指定一些参数
FROM centos:7
ARG user #ARG user=root
USER $user
...
# docker build --build-arg user=<user> <Dockerfile>
(二)Build镜像命令
# OPTIONS:
# -t, --tag list #镜像名称
# -f, --file string #指定Dockerfile文件位置
$ docker image build [OPTIONS] PATH | URL | -
# 例如
$ docker build .
$ docker build -t <image> .
$ docker build -t <image>:<tag> . -f <Dockerfile> <context-path>
(三)部署过程
1、自定义网络
$ docker network create <network>
2、创建所需容器A
$ docker run -itd \
--name <container-a> \
--net <network> \
-p <host-port>:<container-port> \
--mount type=bind,src=<volume>,dst=<dst> \
<image-a>:<tag-a>
3、创建所需容器B
# 略
六、docker镜像仓库
(一)搭建私有镜像仓库
1、下载registry镜像并启动
$ docker pull registry
$ docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always - registry registry
2、查看镜像仓库中所有镜像
$ curl http://<remote-host>:5000/v2/_catalog
3、配置私有仓库信任
$ vi /etc/docker/daemon.json
{
"insecure-registries":["<remote-host>:5000"]
}
$ systemctl restart docker
4、打标签
$ docker tag <image> <remote-host>:5000/<image>:<tag>
5、上传
$ docker push <remote-host>:5000/<image>:<tag>
6、下载
$ docker pull <remote-host>:5000/<image>:<tag>
7、列出镜像表
$ curl http:<remote-host>:5000/v2/<image>/tags/list
(二)Docker Hub公共仓库的使用
1、注册账号
2、登录Docker Hub
$ docker login
$ docker login --username=<username> --password=<password>
3、镜像打标签
$ docker tag <image>:<tag> <username>/<image>:<tag>
4、上传
$ docker push <username>/<image>:<tag>
5、搜索
$ docker search <username>
6、下载
$ docker pull <username>/<image>:<tag>
七、实战
(一)搭建flask网站
1、Dockerfile
# Dockerfile内容
...
# build Dockerfile
2、创建网络
$ docker network create <network>
3、需要的容器
通用命令
$ docker run -itd \
--name <container> \
--net <network> \
-p <host-port>:<container-port> \
--mount (type=bind),src=<volume>,dst=<dst> \
<image>:<tag>
(一)mysql
1、配置文件
# 修改copy来的配置文件
$ sudo vi /root/docker/mysql/mysql.cnf
#通常都是字符集与端口的配置
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character_set_server=utf8
# sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
# 配置大小写不敏感
# lower_case_table_names=1
2、安装mysql容器
# 命令来源于官网
$ docker run - some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
根据下面安装方法可以跳过第二个步骤
# 实际使用
# <volume-path>=/var/lib/docker/volumes/mysql
# <dst>=/var/lib/mysql
$ docker run -itd \
--name con-mysql \
-p 3306:3306 \
-v vol-mysql:/var/lib/mysql \
-v /opt/docker/mysql/mysql.cnf:/etc/mysql/conf.d/mysql.cnf \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
(二)redis
1、配置文件
# bind 127.0.0.1
# protected-mode no
appendonly yes//持久化
# requirepass yourpassword
2、安装
# 官网
$ docker run --name some-redis -d redis redis-server --appendonly yes
# 实际使用
$ docker run -itd \
--name con-redis \
-p 6379:6379 \
-v vol-redis:/data \
-v /opt/docker/redis/redis.conf:/usr/local/etc/redis/redis.conf \
redis:5.0 \
redis-server /usr/local/etc/redis/redis.conf
(三)python的flask(OnekkiSite)
1、Dockerfile
FROM python:3.7
ADD ./OnekkiSite /var/www/onekki.xyz/OnekkiSite
WORKDIR /var/www/onekki.xyz/OnekkiSite
RUN pip install -r requirements.txt
CMD ["python", "manager.py", "server"]
2、创建容器
docker run -itd \
--name con-onekki.xyz \
-p 5000:5000 \
-v /opt/docker/onekki.xyz/OnekkiSite:/var/www/onekki.xyz/OnekkiSite \
onekki.xyz:1.0.0
(四)nginx
安装
# 官网
$ docker run --name some-nginx -d -p 8080:80 some-content-nginx
# 实际使用
$ docker run -itd \
--name con-nginx \
-p 80:80 \
-v /opt/docker/nginx/html:/usr/share/nginx/html \
-v /opt/docker/nginx/nginx.conf:/etc/nginx/nginx.conf \
--link con-onekki.xyz \
nginx:1.16
# /opt/docker/nginx/nginx.conf
server {
listen 80;
server_name 39.107.230.35;
location / {
proxy_pass http://con-onekki.xyz:5000;
}
access_log /var/log/nginx/access.log main;
}
# 默认
# cat /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
网友评论